Сначала код Entity Framwork - обработка наследования и композиции - PullRequest
0 голосов
/ 24 марта 2019

Я учу себя основам Entity Framework.На самом деле я относительно новичок во всем мире .net.

У меня есть классы, подобные приведенным ниже (извинения за псевдокод, фактический код слишком длинный для вставки).

Account
{
   User UserInfo {get;set;}
}

User
{
   string Email {get;set;}
}

Admin:Account
{
   // some properties
}

Я пытаюсь сгенерировать таблицы БД, используя EFкод первый шаблон.С вышеперечисленными классами у меня есть начальная подпрограмма, которая выглядит следующим образом:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Account>().HasData(
        new Admin
        {
            UserInfo = new User {Email = "abc@xyz.com"}
        });
}

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

Начальный объект для типа объекта «Учетная запись» не может быть добавлен, поскольку предоставленное значение имеет производный тип «Администратор».Добавьте производные начальные сущности в соответствующий тип сущности.

Итак, я изменил код, как показано ниже (заменив Account на Admin):

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Admin>().HasData(
        new Admin
        {
            UserInfo = new User {Email = "abc@xyz.com"}
        });
}

И теперь я получаюэта ошибка (не знаю, откуда исходит UserInfoEmail):

Невозможно добавить начальный объект для типа объекта «Администратор», поскольку для него установлена ​​навигация «Пользовательская информация».Чтобы заполнить отношения, вам нужно добавить семя связанной сущности в 'User' и указать значения внешнего ключа {'UserInfoEmail'}.Подумайте об использовании DbContextOptionsBuilder.EnableSensitiveDataLogging, чтобы увидеть значения соответствующих свойств.

Я не понимаю, какова вся эта концепция обработки отношений при использовании шаблона первого кода.Может кто-нибудь, пожалуйста, помогите мне понять, что означают вышеуказанные ошибки, и как обрабатывать отношения (например, состав и наследование) при использовании первого шаблона кода EF.

1 Ответ

0 голосов
/ 24 марта 2019

Вторая попытка была близка, но вы сделали одну ошибку:

modelBuilder.Entity<Admin>().HasData(
    new Admin
    {
        UserInfo = new User {Email = "abc@xyz.com"}
    });

Посмотрите, здесь вы установили UserInfo на new User.Ваша ошибка означает, что вы не можете добавить User сущность при попытке добавить Admin сущность.Вместо этого сначала добавьте User и ссылайтесь на него из сущности Admin (похоже, Email - это ваш первичный ключ в User сущности):

modelBuilder.Entity<User>().HasData(
    new User
    {
        Email = "abc@xyz.com"
    });
modelBuilder.Entity<Admin>().HasData(
    new Admin
    {
        UserInfoId = "abc@xyz.com"
    });

Если у вас нет UserInfoIdв Account классе, просто добавьте его:

class Account
{
    User UserInfo { get; set; }

    string UserInfoId { get; set; }
}
...