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

时间:2015-03-05 15:46:13

标签: c# sql-server entity-framework entity-framework-6 asp.net-identity

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

  • 身份:存储用户和角色的所有AspNet身份表。
  • 应用程序:存储我的所有常规应用程序表。

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

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

例如,我想要一个application.Tenants表,其中identity.AspNetUsers有一个外键,这样我就可以拥有属于单个租户的许多用户。

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

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

1 个答案:

答案 0 :(得分:1)

为什么要使用两个单独的DbContext s?为ASP.NET身份数据和业务实体创建单个上下文会更容易:

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

    public DatabaseContext()
        : base("name=DatabaseContext")
    {
    }
}

请注意,DatabaseContext继承自IdentityDbContext<UserInfo>

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