在IdentityDbContext和主应用程序DbContext之间共享Users表

BG1*_*100 5 c# sql-server entity-framework entity-framework-6 asp.net-identity

我的应用程序(内置MVC5/EF6)需要使用具有两个模式的单个数据库:

  • identity:存储用户和角色的所有AspNet标识表.
  • application:存储我的所有常规应用程序表.

我想为每个模式使用一个单独的DbContext,其中identity一个使用Microsoft.AspNet.Identity.EntityFramework.IdentityDbContext<ApplicationUser>帮助器类创建,而主要application一个是在代码中创建的,首先是代码.有这样两个DbContexts的原因是我可以将主应用程序上下文放在一个单独的程序集中,并在其他相关项目中使用它而不必引用Asp.Net.

但是,我想在application架构/上下文中引用一个表,该表包含我要添加到identity.AspNetUsers表中的外键以及一些其他额外字段.然后我想Users在主上下文中创建一个映射到identity.AspNetUsers表的实体.

例如,我想要一个具有外键的application.Tenantsidentity.AspNetUsers,以便我可以拥有属于单个租户的许多用户.

所有这一切都很好我认为并且没有任何问题,除了创建数据库,以及可能影响该表的任何迁移,因为我将有两个DbContext试图创建相同的表.

我可以将表标记OnModelCreating为"不创建",如果是,我该如何添加外键约束?如果没有,那我该如何处理呢?我不认为我想做的事情是不合理的.我只是想避免让两个"用户"表与隐含的外键链接(即没有实际的外键约束).

Ser*_*diy 2

到底为什么要使用两个单独的DbContexts ?对于 ASP.NET 身份数据和业务实体来说,使用单一上下文会更容易:

public class DatabaseContext : IdentityDbContext<UserInfo>
{
    public virtual DbSet<Entity> Entities { get; set; } // Your business entities

    public DatabaseContext()
        : base("name=DatabaseContext")
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意, 继承DatabaseContextIdentityDbContext<UserInfo>.

这种方法有一些权衡:例如,您的数据访问层应该引用Microsoft.AspNet.Identity.CoreMicrosoft.AspNet.Identity.EntityFramework;但是,如果您使用依赖项注入或实体框架迁移,那么在项目中拥有单个数据库上下文会使事情变得更加容易。