Ошибка Add-Migration с типом EF Core Owned - PullRequest
0 голосов
/ 18 января 2019

У меня есть два "собственных" типа, на которые ссылается ApplicationUser (который наследуется от IdentityUser):

using System;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;

namespace OwnedEntityTest.Data
{
    public class ApplicationUser : IdentityUser
    {
        public PersonalName Name { get; set; }
        public ValidationToken ValidationToken { get; set; }
    }

    [Owned]
    public class PersonalName
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

    [Owned]
    public class ValidationToken
    {
        public int ValidationCode { get; set; }
        public DateTime ExperiationDateUTC { get; set; }
    }
}

Когда я добавляю новую миграцию, скаффолдер жалуется:

Невозможно использовать таблицу «IdentityUser» для типа сущности «ValidationToken», поскольку она используется для типа сущности «PersonalName» и между их первичными ключами нет взаимосвязи.

Это просто ошибка или я делаю что-то не так (или не понимаю что-то о собственных типах)?

Да, вы можете воссоздать эту проблему:

  1. Создание нового проекта из ASP.NET Core Web Application шаблона проекта
  2. Выбрать Web Application
  3. Нажмите Change Authentication и выберите Individual user accounts
  4. В консоли диспетчера пакетов введите update-database, чтобы обновить снимок модели.
  5. Добавьте приведенный выше код к проекту
  6. В ApplicationDbContext добавить ссылку на ApplicationUsers:
    public DbSet<ApplicationUser> ApplicationUsers { get; set; }
  7. Добавить новую миграцию в Консоль диспетчера пакетов:
    add-migration m_001
  8. Та да ... вы должны увидеть сообщение об ошибке

EDIT:

Microsoft подтвердила, что это ошибка .

1 Ответ

0 голосов
/ 24 января 2019

Тем временем вы можете использовать свободный метод для настройки этого.

  1. Удалить атрибуты [Owned] из модели данных
  2. Настройте отношения, переопределив метод OnModelCreating на вашем ApplicationDbContext

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
    
        modelBuilder.Entity<ApplicationUser>(b =>
        {
            b.OwnsOne(e => e.Name);
            b.OwnsOne(e => e.ValidationToken);
        });
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...