EF Code First prevent property mapping with Fluent

2019-02-04 02:11发布

I have a class Product and a complex type 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
}

Is it possible to prevent mapping "Country" property from AddressDetails inside Product class? (because i will never need it for Product class)

Something like this

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

7条回答
混吃等死
2楼-- · 2019-02-04 02:46

If you are using an implementation of EntityTypeConfiguration you can use the Ignore Method:

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楼-- · 2019-02-04 02:47

It can be done in Fluent API as well, just add in the mapping the following code

this.Ignore(t => t.Country), tested in EF6

查看更多
男人必须洒脱
4楼-- · 2019-02-04 02:49

Try this

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

It worked for me in similar case.

查看更多
时光不老,我们不散
5楼-- · 2019-02-04 02:50

For EF5 and older: In the DbContext.OnModelCreating override for your context:

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

For EF6: You're out of luck. See Mrchief's answer.

查看更多
Anthone
6楼-- · 2019-02-04 02:50

Unfortunately the accepted answer doesn't work, not at least with EF6 and especially if the child class is not an entity.

I haven't found any way to do this via fluent API. The only way it works is via data annotations:

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

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

Note: If you have a situation where Country should be excluded only when it is part of certain other entity, then you're out of luck with this approach.

查看更多
beautiful°
7楼-- · 2019-02-04 02:59

On EF6 you can configure the complex type:

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

That way the property Country will be always ignored.

查看更多
登录 后发表回答