我的应用程序(内置于 MVC5/EF6 中)需要使用具有两个模式的单个数据库:
- identity:存储用户和角色的所有 AspNet 身份表。
- application:存放我所有的通用应用表。
我想为每个模式使用一个单独的 DbContext,使用 identity
一个是用 Microsoft.AspNet.Identity.EntityFramework.IdentityDbContext<ApplicationUser>
创建的辅助类和主要类 application
一个是用代码先创建的。有两个像这样的 DbContext 的原因是,我可以将主应用程序上下文放在一个单独的程序集中,并在其他相关项目中使用它,而无需引用 Asp.Net。
但是,我想引用 application
中的一个表带有我想添加到 identity.AspNetUsers
的外键的架构/上下文表,以及其他一些额外的字段。然后我想创建一个 Users
映射到 identity.AspNetUsers
的主要上下文中的实体表。
例如,我想要一个 application.Tenants
其中表identity.AspNetUsers
有一个外键,这样我就可以拥有属于一个租户的多个用户。
我认为所有这一切都很好,并且不会出现任何问题,除了创建数据库以及可能影响该表的任何迁移,因为我将有两个 DbContext 尝试创建同一个表。
我可以在 OnModelCreating
内标记一个表吗?作为“不创建”,如果是这样,我该如何添加外键约束?如果没有,我该如何处理?我不认为我正在尝试做的事情是不合理的。我只是想避免将两个“用户”表与隐含的外键链接(即没有实际的外键约束)。
最佳答案
您为什么要使用两个单独的 DbContext
秒?为 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.Core
和 Microsoft.AspNet.Identity.EntityFramework
;但是,如果您使用依赖项注入(inject)或 Entity Framework 迁移,那么在您的项目中拥有一个数据库上下文会使事情变得容易得多。
关于c# - 在 IdentityDbContext 和主应用程序 DbContext 之间共享用户表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28881956/