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 .