身份和继承错误迁移时:无法在“人”上配置密钥,因为它是派生类型

时间:2018-09-13 13:50:18

标签: c# asp.net-core asp.net-identity entity-framework-core

我正在使用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”属性中不包含“用户”,在“模型构建器”的配置调用中引用它,或者在包含的类型上从导航属性引用它在模型中。

我已经测试了这些更改:

1)如果Owner的类型变为Person,则错误消失了,但这不是我的选择,因为实际上User和Document在库中,而我的最终应用使用该库和Person在App中。

2)如果ApplicationDbContext从DbContext继承,则错误消失。

有没有解决方法?

1 个答案:

答案 0 :(得分:2)

要使用PersonIdentityDbContext而不更改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; }
}