Подтвердить что ты не робот

EF Code Сначала предотвратите сопоставление свойств с Fluent API

У меня есть класс 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();
4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

Попробуйте это

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

Это сработало для меня в аналогичном случае.

Ответ 6

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

Ответ 7

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

this.Ignore(t = > t.Country), проверенный в EF6