Entity Framework Code First не позволява на Entity да реализира интерфейс директно

Може ли рамката на обекта да пренебрегне факта, че внедрявам интерфейси в обект? Ситуацията е, че имам клас Tag, който имплементира интерфейс IModelObject, който определя, че всеки клас, който го имплементира, трябва да има свойството Id. Класът е по-долу:

public class Tag : IModelObject, IEquatable<Tag>
{
    [ScaffoldColumn(false)]
    public virtual int Id
    {
        get;
        set;
    }

    [Required]
    public virtual string Name
    {
        get;
        set;
    }...

}

И всеки обект в моя модел на домейн имплементира IModelObject. Няма базов клас, а само интерфейс. Картографирането по подразбиране работи, но в базата данни се добавя колона Discriminator. И този дискриминатор не е част от моя модел на домейн, така че не ми трябва в моята база данни.
Внедряването на интерфейс не е наследство, аз също внедрявам интерфейс IEquatable. Така че защо Entity Framework действа така, сякаш това е наследяване и добавя колона Discriminator и как мога да избегна това, като не използвам базови или абстрактни класове?


person gljivar    schedule 19.09.2012    source източник
comment
Атрибутът [NotMapped] работи ли за вас? Ще трябва да зададете това за всяко свойство, дефинирано от интерфейса(ите) във всяко изпълнение на интерфейса...   -  person Mufaka    schedule 20.09.2012
comment
modelBuilder.Ignore‹MissingTag› реши проблема и аз не споменах класа MissingTag във въпроса, защото забравих или не смятах, че е подходящ за този проблем.   -  person gljivar    schedule 20.09.2012


Отговори (1)


Малко съм объркан от вашите разсъждения. Наследството няма нищо общо с вашия проблем. Вашият проблем е, че вашият обект съдържа свойства (и виртуални такива. EF прави специални неща с виртуални свойства). EF ще създаде колона за всяка публична собственост на вашия обект. Не съм сигурен защо мислите, че не трябва, тъй като това е, което прави.

Ако искате EF да игнорира свойство, тогава можете да използвате атрибута [NotMapped] на свойството и EF ще го игнорира.

person Erik Funkenbusch    schedule 19.09.2012
comment
Това, че създаде колона за всяка публична собственост, е добре. Но също така добави колона Discriminator, EF действаше като таблица на йерархично картографиране. Успях да реша проблема и ти беше прав, нямаше нищо общо с интерфейса. Проблемът беше, че се опитвах да внедря шаблон за специален случай (martinfowler.com/eaaCatalog/specialCase.html) и обектът MissingTag да бъде създаден и върнат, ако напр. в базата данни не беше намерен етикет с искан идентификатор. И това беше проблемът, защото откри, че MissingTag наследява от Tag и аз пропуснах този факт. - person gljivar; 20.09.2012
comment
Виртуалните имоти също не бяха проблем. Реших всичко, като добавих modelBuilder.Ignore‹MissingTag›. Имам нужда от виртуални свойства, за да върна специални стойности на Id и Name. - person gljivar; 20.09.2012