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 действует так, как будто это наследование, и добавляет столбец «Дискриминатор» и как я могу избежать этого, не используя базовые или абстрактные классы?


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
То, что он создал столбец для каждого общедоступного свойства, в порядке. Но он также добавил столбец «Дискриминатор», EF действовал так, как будто это таблица для сопоставления иерархии. Мне удалось решить проблему, и вы были правы, это не имело никакого отношения к интерфейсу. Проблема заключалась в том, что я пытался реализовать шаблон Special Case (martinfowler.com/eaaCatalog/specialCase.html) и создать экземпляр объекта MissingTag и вернуть его, если, например, тег с запрошенным идентификатором не был найден в базе данных. И в этом была проблема, потому что он обнаружил, что MissingTag наследуется от тега, и я пропустил этот факт. - person gljivar; 20.09.2012
comment
Виртуальные объекты тоже не были проблемой. Я решил все, добавив modelBuilder.IgnoreMissingTag›. Мне нужны виртуальные свойства, чтобы возвращать специальные значения Id и Name. - person gljivar; 20.09.2012