EF 6.1 Fluent API: игнорировать свойство базового класса

1

У меня есть базовый класс для всех объектов:

public class BaseClass
{
    public int SomeProperty {get; set;}
}

public class SomeEntity : BaseClass
{
    ...
}

Я хочу игнорировать это свойство в некоторых случаях. Могу ли я сделать в методе OnModelCreating что-то вроде этого:

public class MyContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Properties<int>()
                    .Where(p => p.Name == "SomeProperty")
                    .Ignore();
}

?

Теги:
ef-code-first

2 ответа

2

Вы можете попробовать:

modelBuilder.Entity<SomeEntity>().Ignore(p => p.SomeProperty);

Это приведет к тому, что SomeProperty не будет отображаться на SomeEntity.

EDIT: Если это свойство никогда не должно быть сопоставлено с базой данных, вы можете добавить аннотацию NotMapped в свой BaseClass:

public class BaseClass
{
    [NotMapped]
    public int SomeProperty {get; set;}
}

Это будет таким же, как игнорирование этого свойства во всех расширяющих классах.

  • 1
    Я знаю об этой конструкции. Но у меня много сущностей и 1) я не хочу добавлять их для каждой сущности 2) когда я создаю новую сущность, мне нужно добавить еще одну.
0

Поздняя запись здесь - но в случае, если это полезно...

Недавно столкнувшись с подобными требованиями, я пошел с этим: -

public class MyContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder mb)
    {
        mb.Types<EntityBase>()
          .Configure(config => config.Ignore(x => x.SomeBaseClassPropertyToIgnore));
    }
}

Это применит данную конфигурацию ко всем типам сущностей, которые наследуются от EntityBase. Такую же технику можно использовать для настройки типов объектов на основе интерфейса, который они реализуют (вероятно, в любом случае это лучший подход).

Преимущества: -

  • Не нужно писать и поддерживать один и тот же код конфигурации для нескольких конкретных объектов.
  • Нет необходимости в атрибуте [NotMapped], который менее гибкий и добавляет потенциально нежелательные зависимости.

Обратите внимание, что целевые типы могут быть дополнительно отфильтрованы, если необходимо: -

protected override void OnModelCreating(DbModelBuilder mb)
{
    mb.Types<EntityBase>().Where(t => t != typeof(SpecialExceptionEntity)).Configure(...);
}

Refs: -

https://msdn.microsoft.com/en-us/library/dn235653(v=vs.113).aspx

https://msdn.microsoft.com/en-us/library/dn323206(v=vs.113).aspx

Ещё вопросы

Сообщество Overcoder
Наверх
Меню