EF代码优先防止流利的API属性映射(EF Code First prevent property

2019-07-20 16:57发布

我有一类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
}

是否有可能阻止映射“国家”财产AddressDetailsProduct类? (因为我永远不会需要它的Product类)

像这样的事情

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

Answer 1:

对于EF5和老年人:DbContext.OnModelCreating覆盖为背景:

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

对于EF6:你的运气了。 见Mrchief的答案 。



Answer 2:

不幸的是,接受的答案是不行的,没有至少有EF6尤其是如果子类不是一个实体。

我还没有发现任何方式通过流畅API来做到这一点。 它的工作的唯一方式是通过数据的注释:

public class AddressDetails
{
    public string City { get; set; }

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

注意:如果你所处的环境Country应被排除在外,只有当它是某些其他实体的一部分,那么你的运气了这种方法。



Answer 3:

如果您正在使用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");
}


Answer 4:

虽然我知道这是一个老问题,答案也没有解决与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超载,它会与配置对象的其余部分被拾起。



Answer 5:

在EF6您可以配置复杂类型:

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

这样的财产国家会始终被忽略。



Answer 6:

试试这个

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

它在类似情况下为我工作。



Answer 7:

它可以用流利的API来完成的,只需添加在映射下面的代码

this.Ignore(T => t.Country),在测试EF6



文章来源: EF Code First prevent property mapping with Fluent API