簡體   English   中英

在 IdentityDbContext 和主應用程序 DbContext 之間共享用戶表

[英]Sharing the Users table between an IdentityDbContext, and a main application DbContext

我的應用程序(內置於 MVC5/EF6)需要使用具有兩個架構的單個數據庫:

  • identity :存儲用戶和角色的所有 AspNet 身份表。
  • application :存儲我所有的通用應用程序表。

我想為每個架構使用一個單獨的 DbContext, identity一個是使用Microsoft.AspNet.Identity.EntityFramework.IdentityDbContext<ApplicationUser>幫助Microsoft.AspNet.Identity.EntityFramework.IdentityDbContext<ApplicationUser>類創建的,而主application是在代碼中首先創建的。 有兩個這樣的 DbContext 的原因是,我可以將主應用程序上下文放在一個單獨的程序集中,並在其他相關項目中使用它,而不必引用 Asp.Net。

但是,我想引用application架構/上下文中的一個表,其中包含一個我想添加到identity.AspNetUsers表中的外鍵,以及其他一些額外的字段。 然后我想在映射到identity.AspNetUsers表的主上下文中創建一個Users實體。

例如,我想要一個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.CoreMicrosoft.AspNet.Identity.EntityFramework 但是,如果您使用依賴注入或實體框架遷移,那么在您的項目中擁有單個數據庫上下文會使事情變得更加容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM