我有一类Product
和一个复杂类型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
}
是否有可能阻止映射“国家”财产AddressDetails
内Product
类? (因为我永远不会需要它的Product
类)
像这样的事情
Property(p => p.AddressDetails.Country).Ignore();
对于EF5和老年人:在DbContext.OnModelCreating
覆盖为背景:
modelBuilder.Entity<Product>().Ignore(p => p.AddressDetails.Country);
对于EF6:你的运气了。 见Mrchief的答案 。
不幸的是,接受的答案是不行的,没有至少有EF6尤其是如果子类不是一个实体。
我还没有发现任何方式通过流畅API来做到这一点。 它的工作的唯一方式是通过数据的注释:
public class AddressDetails
{
public string City { get; set; }
[NotMapped]
public string Country { get; set; }
// other properties
}
注意:如果你所处的环境Country
应被排除在外,只有当它是某些其他实体的一部分,那么你的运气了这种方法。
如果您正在使用EntityTypeConfiguration的实现可以用忽略方法:
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");
}
虽然我知道这是一个老问题,答案也没有解决与EF 6我的问题。
对于EF 6,你需要创建一个ComplexTypeConfiguration映射。
例:
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);
}
}
如果您的上下文加载配置手动你需要添加新的ComplexMap,如果您使用FromAssembly超载,它会与配置对象的其余部分被拾起。
在EF6您可以配置复杂类型:
modelBuilder.Types<AddressDetails>()
.Configure(c => c.Ignore(p => p.Country))
这样的财产国家会始终被忽略。
试试这个
modelBuilder.ComplexType<AddressDetails>().Ignore(p => p.Country);
它在类似情况下为我工作。
它可以用流利的API来完成的,只需添加在映射下面的代码
this.Ignore(T => t.Country),在测试EF6