Marco de entidad con código primero no inicializando miembro de clase de clave extranjera -- # campo con entity-framework-6 campo con ef-code-first camp Relacionados El problema

Entity Framework with code first not initializing Foreign Key class member


0
vote

problema

Español

Estoy usando EF 6, con código primero y tengo una clase de modelo de dominio que tiene 2 FKS y los objetos relacionados como miembros de la clase. La inserción está funcionando bien, pero cuando se trata de obtener los valores desde la base de datos, los objetos FKS relacionados con este objeto son nulos.

He intentado establecer la inicialización perezosa a FALSO y para marcar los miembros de la clase FK como virtual. He intentado cargar con entusiasmo y todavía ningún resultado positivo (no quiero usar ansiosamente de todos modos).

  public class AffectedLocation {     public AffectedLocation()     {         Id = Guid.NewGuid();     }      [Key]     [Required]     public Guid Id { get; set; }      [Required]     public string Name { get; set; }     public string Description { get; set; }      [Required]     [ForeignKey("RadiationLevel")]     public Guid FK_RadiationLevel { get; set; }     public virtual RadiationLevel RadiationLevel { get; set; }      [Required]     [ForeignKey("GeographicalCoordinates")]     public Guid FK_GeographicalCoordinates { get; set; }     public virtual GeographicalCoordinates GeographicalCoordinates { get; set;  }  public class RadiationLevel {     public RadiationLevel()     {         Id = Guid.NewGuid();     }      [Key]     public Guid Id { get; set; }      [Required]     public int Level { get; set; }      public string Description { get; set; } }  public class GeographicalCoordinates {     public GeographicalCoordinates()     {         Id = Guid.NewGuid();     }      [Key]     public Guid Id { get; set; }      [Required]     public float Latitude { get; set; }      [Required]     public float Longitude { get; set; }      [Required]     public float Range { get; set; } }  public class Repository<TEntity> : IRepository<TEntity> where TEntity : class {     protected readonly DbContext Context;      public Repository(DbContext context)     {         Context = context;     }      public IEnumerable<TEntity> GetAll()     {         return Context.Set<TEntity>().ToList();     } }  public class LocationRepository : Repository<AffectedLocation>, ILocationRepository {     public LocationRepository(RadioactiveAreaContext context)         : base(context)     {      } }  public class UnitOfWork : IUnitOfWork {     private readonly RadioactiveAreaContext _context;      public UnitOfWork()     {         _context = new RadioactiveAreaContext();         Location = new LocationRepository(_context);     }      public ILocationRepository Location { get; private set; }      public int Complete()     {         return _context.SaveChanges();     }      public void Dispose()     {         _context.Dispose();     } }  public class RadioactiveAreaContext : DbContext {     public RadioactiveAreaContext()         : base("name=RadioactiveAreaContext")     {         this.Configuration.LazyLoadingEnabled = false;     }      public virtual DbSet<AffectedLocation> Locations { get; set; }     public virtual DbSet<RadiationLevel> RadiationLevels { get; set; }     public virtual DbSet<GeographicalCoordinates> GeographicalCoordinates { get; set; }          protected override void OnModelCreating(DbModelBuilder modelBuilder)     {         modelBuilder.Configurations.Add(new LocationConfiguration());         modelBuilder.Configurations.Add(new RadiationLevelsConfiguration());         modelBuilder.Configurations.Add(new GeographicalCoordinatesConfiguration());     } }   var unitOfWork = new UnitOfWork();  unitOfWork.Location.Add(someLocation);  unitOfWork.Complete();  var locations = unitOfWork.Location.GetAll(); // first location will be correctly loaded from the database, please see the first picture (the values are not null)  //Adding a new location and call again the GetAll(), will give 2 results now, but the second result is a EF dynamic proxy and doesn't have the FK class members loaded...   

Eche un vistazo a esas imágenes, obteniendo los datos después de que la primera inserción esté bien, pero después de la segunda inserción, al obtener los datos, esto sucederá:

dos muppets dos muppets

Original en ingles

I am using EF 6, with code first and I have a domain model class which has 2 FKs and the related objects as class members. The insertion is working fine but when it comes to get the values from within the database, the FKs objects related to this object are null.

I've tried to set Lazy Initialization to false and to mark the FK class members as virtual. I've tried Eagerly Loading and still no positive result (I don't want to use Eagerly anyway).

public class AffectedLocation {     public AffectedLocation()     {         Id = Guid.NewGuid();     }      [Key]     [Required]     public Guid Id { get; set; }      [Required]     public string Name { get; set; }     public string Description { get; set; }      [Required]     [ForeignKey("RadiationLevel")]     public Guid FK_RadiationLevel { get; set; }     public virtual RadiationLevel RadiationLevel { get; set; }      [Required]     [ForeignKey("GeographicalCoordinates")]     public Guid FK_GeographicalCoordinates { get; set; }     public virtual GeographicalCoordinates GeographicalCoordinates { get; set;  }  public class RadiationLevel {     public RadiationLevel()     {         Id = Guid.NewGuid();     }      [Key]     public Guid Id { get; set; }      [Required]     public int Level { get; set; }      public string Description { get; set; } }  public class GeographicalCoordinates {     public GeographicalCoordinates()     {         Id = Guid.NewGuid();     }      [Key]     public Guid Id { get; set; }      [Required]     public float Latitude { get; set; }      [Required]     public float Longitude { get; set; }      [Required]     public float Range { get; set; } }  public class Repository<TEntity> : IRepository<TEntity> where TEntity : class {     protected readonly DbContext Context;      public Repository(DbContext context)     {         Context = context;     }      public IEnumerable<TEntity> GetAll()     {         return Context.Set<TEntity>().ToList();     } }  public class LocationRepository : Repository<AffectedLocation>, ILocationRepository {     public LocationRepository(RadioactiveAreaContext context)         : base(context)     {      } }  public class UnitOfWork : IUnitOfWork {     private readonly RadioactiveAreaContext _context;      public UnitOfWork()     {         _context = new RadioactiveAreaContext();         Location = new LocationRepository(_context);     }      public ILocationRepository Location { get; private set; }      public int Complete()     {         return _context.SaveChanges();     }      public void Dispose()     {         _context.Dispose();     } }  public class RadioactiveAreaContext : DbContext {     public RadioactiveAreaContext()         : base("name=RadioactiveAreaContext")     {         this.Configuration.LazyLoadingEnabled = false;     }      public virtual DbSet<AffectedLocation> Locations { get; set; }     public virtual DbSet<RadiationLevel> RadiationLevels { get; set; }     public virtual DbSet<GeographicalCoordinates> GeographicalCoordinates { get; set; }          protected override void OnModelCreating(DbModelBuilder modelBuilder)     {         modelBuilder.Configurations.Add(new LocationConfiguration());         modelBuilder.Configurations.Add(new RadiationLevelsConfiguration());         modelBuilder.Configurations.Add(new GeographicalCoordinatesConfiguration());     } }   var unitOfWork = new UnitOfWork();  unitOfWork.Location.Add(someLocation);  unitOfWork.Complete();  var locations = unitOfWork.Location.GetAll(); // first location will be correctly loaded from the database, please see the first picture (the values are not null)  //Adding a new location and call again the GetAll(), will give 2 results now, but the second result is a EF dynamic proxy and doesn't have the FK class members loaded... 

Please have a look at those pictures, getting the data after the first insertion is fine but after the second insertion, when getting the data, this will happen:

two muppets two muppets

        

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

Cuando guarda la ubicación por primera vez e intente obtener todos los lugares, se cargará correctamente en el contexto porque lo agrega en el mismo contexto, Las entidades relacionadas con la segunda vez serán nulos porque es nuevo contexto

Esto sucede porque la carga perezosa no está habilitada

   this.Configuration.LazyLoadingEnabled = false;   

Para obtener elementos relacionados, debe incluirlos Compruebe esto < / a>

1-AGREGAR GOTETALWITHINGCLUDE A SU BASE Repository

  public IEnumerable<TEntity> GetAllWithInclude(List<string> includes) {     IQueryable<TEntity> entities = Context.Set<TEntity>();     foreach (var include in includes)     {         entities = entities.Include(include);     }     return entities.ToList(); }    

2- Agregue GetallWitHInClude a la interfaz de ILOICACIÓNRepositoria

  IEnumerable<AffectedLocation> GetAllWithInclude(List<string> includes);   

3: para obtener sus datos agregar sub entidades que desea incluir para incluir la lista

  List<string> includes = new List<string> {     "RadiationLevel",     "GeographicalCoordinates" };  List<AffectedLocation> affectedLocations = uow.Location.GetAllWithInclude(includes).ToList();   

 

When you save location at first time and try to get all locations it will be correctly loaded in the context because you add it in the same context , second time related entities will be null because it is new context

This happens because Lazy Loading is not enabled

 this.Configuration.LazyLoadingEnabled = false; 

To Get related items you should include them Check This

1-Add GetAllWithInclude to your base Repository

public IEnumerable<TEntity> GetAllWithInclude(List<string> includes) {     IQueryable<TEntity> entities = Context.Set<TEntity>();     foreach (var include in includes)     {         entities = entities.Include(include);     }     return entities.ToList(); }  

2- add GetAllWithInclude to ILocationRepository interface

IEnumerable<AffectedLocation> GetAllWithInclude(List<string> includes); 

3-to get your data add sub entities you want to include to includes list

List<string> includes = new List<string> {     "RadiationLevel",     "GeographicalCoordinates" };  List<AffectedLocation> affectedLocations = uow.Location.GetAllWithInclude(includes).ToList(); 
 
 
     
     

Relacionados problema

0  ¿Cómo pasar las matrices del modelo para ver?  ( How to pass arrays from model to view ) 
Estoy aprendiendo a ASP.NET MVC 3, y recientemente intenté muchas veces para pasar matrices / listas / icollecciones, etc. Pero, pero no pudo. Cada vez que la...

1  ¿Cómo usar el automóvil en las tablas de código sin producir duplicados?  ( How to use automapper on code tables without producing duplicates ) 
Estoy usando el automóvil para importar de una base de datos a un nuevo DB con una estructura ligeramente diferente. No estoy seguro de cómo manejar tablas de...

0  Repositorios en .Net Core Library  ( Repositories in net core library ) 
Estoy tratando de envolver las acciones básicas del modelo (como ID, etc.) en los repositorios. Sin embargo, estoy frente a dos problemas: 1. Cadena de con...

35  Implementando cero o uno a cero o una relación en el código de EF primero por API con fluidez  ( Implementing zero or one to zero or one relationship in ef code first by fluent ) 
Tengo dos clases de Poco: clase de orden: addons/web/controllers/main.py:upload_attachment()3 Clase de cotización: addons/web/controllers/main....

1  ¿Cómo usar el código de marco de entidades: primero para generar una clave primaria en clúster?  ( How to use entity framework code first to generate a clustered primary key ) 
Esto es lo que tenemos en la declaración SQL, se omiten algunos nombres de campo para guardar un espacio: CREATE TABLE [dbo].[Payment]( [PaymentId] [uni...

1  Error de andamio No hay una conversión de referencia implícita de la configuración a System.Data.entity.migrations.dbmigrationsconfiguration  ( Scaffolding error there is no implicit reference conversion from configuration t ) 
iTULIZ EF 6.0.2 CODE, VS 2013, MVC 5 y TIENE DBCONTEXT Y CLASE DE CONFIGURACIÓN DIRECTIVADA DE DBMIGRATING CONFIGURATINO CLASE DE COMO ESTE: public class D...

0  Creación de aplicaciones MVC utilizando el motor de afeitar y la FIEFIRST  ( Creating mvc application using razor engine and ef codefirst ) 
Estoy practicando el marco de la entidad. Estoy practicando el marco de MVC ASP.NET utilizando el código de Razor y el código EF primero. Al practicarlo, enco...

1  InvalidOperationException Durante la inicialización de la primera base de datos del código EF6 (el extremo principal de esta asociación debe configurarse explícitamente)  ( Invalidoperationexception during ef6 code first database initialization princip ) 
Estoy usando EF6 y el primer enfoque de código para implementar propiedades personalizadas para los productos pertenece a ciertas categorías (o cualquier otro...

2  EF 4.1 Código Primero mapeando dos columnas en una tabla para enumerar  ( Ef 4 1 code first mapping two columns in one table to list ) 
Estoy teniendo un problema a descubrir cómo hacer que este trabajo sea el código EF 4.1 primero. He mirado a su alrededor y encontré una un problema similar ...

2  Generar la base de datos SQL CE de la clase de código DBContext de EF en una aplicación MVC  ( Generate sql ce database from ef code first dbcontext class in an mvc applicatio ) 
IVE un problema similar como este tipo: generar Base de datos SQL CE de Código EF: primera clase DBCONTEXT Sé que necesito usar Database.DefaultConnect...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos