我正在使用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继承,则错误消失。
有没有解决方法?
答案 0 :(得分:2)
要使用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; }
}