EF Code First阻止使用Fluent API进行属性映射

时间:2013-02-28 08:30:20

标签: c# entity-framework ef-code-first fluent-interface

我有一个班级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();

7 个答案:

答案 0 :(得分:26)

对于EF5及更早版本: 在您的上下文的DbContext.OnModelCreating覆盖中:

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

对于EF6:你运气不好。请参阅Mrchief's answer

答案 1 :(得分:15)

不幸的是,接受的答案并不起作用,至少在EF6上是这样,特别是如果子类不是实体。

我还没有通过流畅的API找到任何方法。它的唯一工作方式是通过数据注释:

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

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

注意:如果您的情况Country只有当它属于某个其他实体时才被排除,那么您对这种方法感到不快。< / p>

答案 2 :(得分:6)

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

答案 3 :(得分:3)

虽然我意识到这是一个老问题,但答案并没有解决我在EF 6中的问题。

对于EF 6,您需要创建一个ComplexTypeConfiguration Mapping。

示例:

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重载它将被其他配置对象选中。

答案 4 :(得分:2)

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

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

这样,财产国家将永远被忽略。

答案 5 :(得分:1)

试试这个

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

在类似情况下,它对我有用。

答案 6 :(得分:-2)

也可以在Fluent API中完成,只需在映射中添加以下代码

即可

this.Ignore(t =&gt; t.Country),在EF6中测试