0

我正在学习构建ASP.NET MVC Core Web应用程序。一切正常,直到我开始将Identity添加到它。ASP.NET MVC Core:添加IdentityUser后出现错误

注册用户可以创建很多作业。我使用ApplicationUser.cs附带的项目用户。我为所有其他实体创建了另一个DbContext

ApplicationUser.cs在型号:

public class ApplicationUser : IdentityUser 
{ 
    // CUSTOM PROPERTIES 
    public string Name { get; set; } 
    public ICollection<Job> Jobs { get; set; } 
} 

Job.cs在型号:

public class Job 
{ 
    public int ID { get; set; } 
    public string Title { get; set; } 

    // contains other properties 

    public string ApplicationUserID { get; set; } 
    public virtual ApplicationUser ApplicationUser { get; set; } 
} 

ApplicationDbContext.cs

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) 
    { 

    } 
    protected override void OnModelCreating(ModelBuilder builder) 
    { 
     base.OnModelCreating(builder); 
    } 
} 

当我在Job.cs添加这些2行,错误弹出。

public string ApplicationUserID { get; set; } 
    public virtual ApplicationUser ApplicationUser { get; set; } 

错误== >>

未处理的异常:System.Exception的:无法解析的 型 'MyProject.Data.JobDbContext' 为参数 '语境' 服务 方法'配置'类型'MyProject.Startup'。 ---> System.InvalidOperationException:实体类型 'IdentityUserLogin'需要定义一个主键。

我知道有一些线程讨论关于同样的错误,但这些答案不能真正帮助。

+0

一些职位说,添加'base.OnModelCreating'语句到'OnModelCreating'方法可以解决这个问题,但它不在我的代码中。 – Matt

+0

阅读错误我认为你的用户模型中没有PK ..可以吗? –

+0

我看不到表格的映射.....你做了这些映射吗? – Lari

回答

2

你的问题是两种不同的情况。

JobDbContext包含Job,它是指ApplicationUser这不是在这种情况下,但由于您链接到它自动添加由EF自动添加。并且这个ApplicationUser(它的父代IdentityUser)包含登录的集合(IdentityUserLogin),它不是这个上下文的一部分,但是由EF自动添加,依此类推......所有这些类都在OnModelCreatingIdentityDbContext中配置,并且未配置JobDbContext这就是为什么你看到这个错误 - 你在JobDbContext中没有这个类的描述键/索引/引用。

您应该将两个DbContext合并为一个,或者从Job类中删除public virtual ApplicationUser ApplicationUser { get; set; }并手动管理相关对象(确保参照完整性,执行延迟加载等)。

+0

这真的很有道理!当我将两个'DbContext'合并成一个时,它就像一个魅力。但我真的想更多地学习如何用两种不同的上下文来管理这个问题 - 我并没有真正明白“手动管理相关对象”的含义。你能告诉我一些例子吗?在我阅读一些在线教程时,他们通常会离开ApplicationDbContext'并创建自己的'DbContext'。而不是所有的'DbContext',看起来单独处理不同部分实体的'DbContext'更加整洁或者分离。 – Matt

+0

想象一下,即使在不同的数据库引擎上,两个不同的dbcontext可能是两个不同的物理数据库。这是EF如何“思考”他们的。它们之间的所有“链接”(一个是“作业”,另一个是“用户”)只存在于你的应用程序中。 EF对cross-dbcontext操作一无所知。如果你的应用应该“如果他至少拥有一份工作,就不要删除用户” - 你应该自己编写这些代码。如果您需要显示带有用户名的作业列表 - 您应该从第一个dbcontext将作业读入List中,从其他dbcontext读取用户并在内存中“手动”合并/加入此列表。 – Dmitry

+0

@Matt,你的问题解决得有多好! ;) – Lari

相关问题