【发布时间】:2019-02-18 06:40:09
【问题描述】:
我正在使用 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");
}
}
当我想添加迁移时它给了我这个错误:
无法在“Person”上配置键,因为它是派生类型。必须在根类型“用户”上配置密钥。如果您不打算将“用户”包含在模型中,请确保它不包含在上下文的 DbSet 属性中、在对模型构建器的配置调用中引用或从包含的类型的导航属性中引用在模型中。
我已经测试了这些更改:
1) 如果 Owner 变为 Person 类型,则会出现错误,但这对我来说不是一个选项,因为实际上 User 和 Document 在一个库中,而我的最终应用程序使用该库,而 Person 在应用程序中。
2) 如果 ApplicationDbContext 继承自 DbContext 则会出现错误。
有没有可用的解决方法?
【问题讨论】:
-
当从
IdentityDbContext<Person>继承时,为什么你甚至还有DbSet<Person>会给你这个? -
@DavidG 我已经删除了,但没有效果。
-
也许你可以尝试用外键将 Person 链接到用户,并让这个外键成为 Person 主键的一部分
-
由于你的根实体是
User(因为需要public User Owner { get; set; }),你的上下文应该派生自IdentityDbContext<User> -
最好的解决方案是不要混合上下文。只需将 person 表添加到
business context中,该表具有链接到当前用户的外键字段(例如,基于sub声明),而不是“真正的”数据库关系。
标签: c# asp.net-core asp.net-identity entity-framework-core