Ошибка идентификации и наследования при миграции: ключ не может быть настроен для «Персона», потому что это производный тип - PullRequest
0 голосов
/ 13 сентября 2018

Я использую EF Core и Identity.Я создал простое приложение:

public class Program
{
    static void Main(string[] args)
    {
    }
}


public class User : IdentityUser
{
}

public class Person : User
{
}

public class Document
{
    public int Id { get; set; }

    public User Owner { get; set; }
}


public class ApplicationDbContext : IdentityDbContext<Person>
{
    public DbSet<Person> Person { get; set; }
    public DbSet<Document> Document { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(@"Server=.\;Database=EFCoreDemo;Trusted_Connection=True;MultipleActiveResultSets=true");
    }
}

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

Ключ не может быть настроен для «Персона», потому что онпроизводный тип.Ключ должен быть настроен для корневого типа «Пользователь».Если вы не предполагали, что «Пользователь» будет включен в модель, убедитесь, что он не включен в свойство DbSet вашего контекста, не указан в вызове конфигурации для ModelBuilder или не указан в свойстве навигации для включенного типа.в модели.

Я проверил эти изменения:

1) Если владелец приобрел тип Person, ошибка возникает, но это не вариант для меня, потому что на самом деле пользователь иДокумент находится в библиотеке, и мое последнее приложение использует эту библиотеку, а Person находится в приложении.

2) Если ApplicationDbContext наследует от DbContext, ошибка исчезает.

Есть ли доступный обходной путь?

1 Ответ

0 голосов
/ 14 сентября 2018

Для использования Person и IdentityDbContext без изменения Document вы можете реализовать новую модель с Document и изменить ее на Person.

    public class ApplicationDbContextTest : IdentityDbContext<Person>
{
    public DbSet<MyDocument> Document { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=EFCoreDemo;Trusted_Connection=True;MultipleActiveResultSets=true");
    }
}
public class User : IdentityUser
{
}

public class Person : User
{
}
public class MyDocument:Document
{
    public new Person Owner { get; set; }
}
public class Document
{
    public int Id { get; set; }

    public User Owner { get; set; }
}
...