Использование общего класса для наследования и для члена (сначала код) - PullRequest
0 голосов
/ 01 февраля 2019

У меня возникают трудности с получением кода EF в первую очередь для создания базы данных из следующих объектов:

public class Person : Animal
{
    public int Id { get; set; }
    public Animal Pet { get; set; }
}

public class Animal
{
    public string Name { get; set; }
}

Таким образом, концептуально человек - это животное с именем, и у него есть домашнее животное, которое такжеживотное с именем.Мой контекст содержит массив людей, но не животных, поэтому Animal не содержит ключ:

public DbSet<Person> People { get; set; }

Если я пытаюсь создать базу данных с использованием кода, сначала получаюследующая ошибка:

System.Data.Entity.ModelConfiguration.ModelValidationException: One or more validation errors were detected during model generation:

MyProject.Database.Animal: : EntityType 'Animal' has no key defined. Define the key for this EntityType.
Animals: EntityType: EntitySet 'Animals' is based on type 'Animal' that has no keys defined.

Если я удаляю поле Pet, я получаю таблицу с полями Id и Name, что является моим ожидаемым поведением.Аналогично, если я удаляю наследование Animal, я получаю таблицу с полями Id и Pet_Name, что опять-таки является моим ожидаемым поведением.То, что я пытаюсь получить, - это таблица с полями Id, Name и Pet_Name.

Не могу не почувствовать, что я упускаю что-то очень простое здесь, потому что я сделалэто на других ОРМ без проблем.Может кто-нибудь сказать мне, как это сделать с EF 6.2?

1 Ответ

0 голосов
/ 01 февраля 2019

Для всех, кто читает это в будущем, EF рассматривает классы как сущности или сложные типы.Сущности получают свою собственную таблицу, в то время как сложные типы добавляют свои собственные поля как поля к классам родителей, которые содержат их как свойства.Если вы объявляете экземпляр класса как свойство другого, тогда EF сразу предполагает, что это Entity;если он видит, что вы пытаетесь использовать его в качестве базового класса в иерархии наследования, тогда он предполагает, что это сложный тип.Ошибка, показанная выше, возникает, когда EF уже ошибочно предположил, что тип является сущностью, но затем вы пытаетесь использовать его как сложный тип.Мне кажется, что EF не должен делать предположения в первую очередь, если у класса нет ключевого свойства, но это так.Решение состоит в том, чтобы просто пометить его как сложный тип с самого начала в вашей функции OnModelCreating:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.ComplexType<Animal>();

    base.OnModelCreating(modelBuilder);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...