32

我有一个类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();
4

7 回答 7

28

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

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

对于 EF6:你不走运。请参阅Mrchief 的回答

于 2013-02-28T10:50:14.070 回答
15

不幸的是,接受的答案不起作用,至少在 EF6 中,尤其是在子类不是实体的情况下。

我还没有找到任何通过 fluent API 来做到这一点的方法。它工作的唯一方法是通过数据注释:

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

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

注意:如果您有一种情况,Country只有当它是某个其他实体的一部分时才应该被排除,那么您对这种方法不走运。

于 2014-07-30T02:11:48.713 回答
10

如果您使用的是 EntityTypeConfiguration 的实现,则可以使用 Ignore 方法:

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");
}
于 2015-01-13T15:30:18.030 回答
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);
    }
}

If your Context is loading configurations manually you need to add the new ComplexMap, if your using the FromAssembly overload it'll be picked up with the rest of the configuration objects.

于 2016-05-25T15:41:34.043 回答
2

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

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

这样,属性 Country 将始终被忽略。

于 2015-06-04T16:23:59.577 回答
1

试试这个

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

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

于 2016-03-29T16:57:26.667 回答
-2

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

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

于 2015-01-07T08:29:49.443 回答