que one many framework first example dbmodelbuilder code c# entity-framework ef-code-first fluent-interface

c# - first - one to many relationship entity framework fluent api



El código EF primero evita la asignación de propiedades con la API Fluent (7)

Aunque me doy cuenta de que esta es una pregunta antigua, las respuestas no resolvieron mi problema con EF 6.

Para EF 6, debe crear una asignación de configuración de tipo complejo.

ejemplo:

public class Workload { public int Id { get; set; } public int ContractId { get; set; } public WorkloadStatus Status {get; set; } public Configruation Configuration { get; set; } } public class Configuration { public int Timeout { get; set; } public bool SaveResults { get; set; } public int UnmappedProperty { get; set; } } public class WorkloadMap : System.Data.Entity.ModelConfiguration.EntityTypeConfiguration<Workload> { public WorkloadMap() { ToTable("Workload"); HasKey(x => x.Id); } } // Here This is where we mange the Configuration public class ConfigurationMap : ComplexTypeConfiguration<Configuration> { ConfigurationMap() { Property(x => x.TimeOut).HasColumnName("TimeOut"); Ignore(x => x.UnmappedProperty); } }

Si su Contexto está cargando configuraciones manualmente, necesita agregar el nuevo ComplexMap, si usa la sobrecarga FromAssembly se recogerá con el resto de los objetos de configuración.

Tengo un Product clase y un tipo complejo AddressDetails

public class Product { public Guid Id { get; set; } public AddressDetails AddressDetails { get; set; } } public class AddressDetails { public string City { get; set; } public string Country { get; set; } // other properties }

¿Es posible evitar la asignación de propiedades "País" de AddressDetails dentro de la clase de Product ? (porque nunca lo necesitaré para la clase de Product )

Algo como esto

Property(p => p.AddressDetails.Country).Ignore();


Desafortunadamente, la respuesta aceptada no funciona, al menos con EF6 y especialmente si la clase secundaria no es una entidad.

No he encontrado ninguna manera de hacer esto a través de API fluida. La única forma en que funciona es a través de anotaciones de datos:

public class AddressDetails { public string City { get; set; } [NotMapped] public string Country { get; set; } // other properties }

Nota: Si tiene una situación en la que el Country debería ser excluido solo cuando es parte de otra entidad, entonces no tiene suerte con este enfoque.


En EF6 puedes configurar el tipo complejo:

modelBuilder.Types<AddressDetails>() .Configure(c => c.Ignore(p => p.Country))

De esa manera la propiedad País siempre será ignorada.


Prueba esto

modelBuilder.ComplexType<AddressDetails>().Ignore(p => p.Country);

Funcionó para mí en un caso similar.


Si está utilizando una implementación de EntityTypeConfiguration, puede usar el método Ignorar:

public class SubscriptionMap: EntityTypeConfiguration<Subscription> { // Primary Key HasKey(p => p.Id) Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); Property(p => p.SubscriptionNumber).IsOptional().HasMaxLength(20); ... ... Ignore(p => p.SubscriberSignature); ToTable("Subscriptions"); }


También se puede hacer en Fluent API, simplemente agregue en el mapeo el siguiente código

esto.Ignore (t => t.País), probado en EF6


Para EF5 y DbContext.OnModelCreating anteriores: en el reemplazo de DbContext.OnModelCreating para su contexto:

modelBuilder.Entity<Product>().Ignore(p => p.AddressDetails.Country);

Para EF6: estás fuera de suerte. Ver la respuesta de Mrchief .