2013-02-28 5 views
27

У меня есть класс Product и сложный тип AddressDetailsEF Code First предотвратить отображение свойств с Fluent API

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(); 
+2

Вы уже переопределили 'DbContext.OnModelCreating'? Есть ли modelBuilder.Entity () .Ignore (p => p.AddressDetails.Country) 'в этом методе не работает? –

+0

Да, точно, но метод Ignore() не существует. – Catalin

+0

Он используется для меня при использовании Entity Framework 4.4. –

ответ

21

Для EF5 и старше: В DbContext.OnModelCreating переопределения для связи:

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

Для EF6: Вам не повезло. См. Mrchief's answer.

+3

Не работает: «Выражение« p => p.AddressDetails.Country »не является допустимым выражением свойства. Выражение должно представлять свойство: C#: 't => t.MyProperty' VB.Net: 'Функция (t) t.MyProperty''. – Mrchief

+1

@Mrchief. Правильно, это было для более старых версий. Я добавил ссылку на ваш ответ, так как это правильный вариант для текущих версий EF. –

+1

Печально, что они активно предотвратили бы это в EF6. Надеюсь, это было по какой-то скрытой причине. –

15

К сожалению, принятый ответ не работает, по крайней мере, с EF6, и особенно если дочерний класс не является сущностью.

Я не нашел никакого способа сделать это с помощью свободного API. Единственный способ это работает через аннотации данных:

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

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

Примечание: Если у Вас есть ситуация, где Country должны быть исключены только тогда, когда она является частью некоторого другого объекта, то вам не повезло с этим подход.

+0

Что значит «если дочерний класс не является сущностью»? Если дочерний класс является «ComplexType»? – Catalin

+0

Да. Если это объект, вы можете добавить свою собственную конфигурацию и пропустить отображение. – Mrchief

+0

@Mrchief вы можете попробовать modelBuilder.ComplexType (). Игнорировать (ad => ad.Country); для достижения того же результата с использованием Fluent API. – Verbon

-1

Это может быть сделано в Fluent API, а также, просто добавьте в отображении следующий код

this.Ignore (т => t.Country), испытанный в EF6

+0

Это не работает со сложными типами. –

+1

Вопрос об игнорировании свойства сложного типа. Точный сценарий, который не будет работать под EF6. –

6

Если вы используете реализация 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"); 
} 
+1

Это не работает со сложными типами. –

+0

Что значит, что он не работает со сложными типами? Сопоставление сложных типов выполняется автоматически, когда вы добавляете ключевое слово 'virtual' в объявление свойства. Если вы не хотите его сопоставлять, просто удалите ключевое слово 'virtual'. – Maxime

+0

О, ты имеешь в виду, когда во вложенном объекте ... я понимаю. – Maxime

2

на EF6 вы можете настроить тип комплекса:

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

Таким образом, свойство Country будет всегда игнорироваться.

2

Попробуйте

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

Он работал для меня в подобном случае.

1

Хотя я понимаю, что это старый вопрос, ответы не решить мою проблему с 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 перегружать он будет ковыряться с остальными объектами конфигурации.

Смежные вопросы