如何在Identity項目使用EF Core和類庫時使用EF6與相同的數據庫訪問用戶

asp.net asp.net-core entity-framework entity-framework-6 entity-framework-core

我們有一個.NET Core項目,它使用Identity 3和IdentityDbContext使用EF Core進行用戶管理。生成的表存儲在一個公共SQL服務器數據庫中,該數據庫也被我們的解決方案中的另一個項目使用,該解決方案是使用EF6的.NET 4.5.2 Framework DataLayer。

(只是更多背景 - .NET Core項目是一個授權服務器,它使用OpenIddict實現OpenIdConnect和Oauth2,並配置了Identity,以便我們可以將用戶保存到數據庫並登錄和驗證)

一旦我們進行了身份驗證,我們就會調用API端點。 API與可與EF6一起使用的DataLayer進行通信。在這個項目中,我需要獲取登錄用戶並與用戶一起處理各種查詢。理想情況下,我想使用和擴展相同的AspNetUsers表。

我想知道推薦的方法是什麼?如果我嘗試在EF6項目中生成User DbContext,我必須添加一個新的遷移,並且腳手架想要創建一個新表 - 一個已經存在於數據庫中的表。我有點不確定在兩個不同的項目中有兩個單獨的上下文,以及它們如何“一起玩得很好”。

一般承認的答案

我能夠讓這個工作。主要問題是我只想訪問我在DotNet 4.51 DataLayer類庫項目中的DotNet Core項目中由Identity 3生成的AspNetUsers表。

我通過在類庫EF 6項目中創建User.cs Entity類並確保它的屬性與Identity 3生成的ApplicationUser.cs類中的列匹配來實現此目的。

User.cs

     public class User{

    [Key]
    public string Id { get; set; }
    public int AccessFailedCount { get; set; }
    public string ConcurrencyStamp { get; set; }
    public string Email { get; set; }
    public bool EmailConfirmed { get; set; }
    public bool LockoutEnabled { get; set; }
    public DateTimeOffset? LockoutEnd { get; set; }
    public string NormalizedEmail { get; set; }
    public string NormalizedUserName { get; set; }
    public virtual string PasswordHash { get; set; }
    public string PhoneNumber { get; set; }
    public bool PhoneNumberConfirmed { get; set; }
    public virtual string SecurityStamp { get; set; }
    public bool TwoFactorEnabled { get; set; }
    public string UserName { get; set; }
}

然後我設置一個EntityConfiguration來映射到AspNetUsers表

UserConfiguration.cs

public class UserConfiguration : EntityTypeConfiguration<User>
{
    public UserConfiguration()
    {
        ToTable("AspNetUsers");
    }
}

在我的DbContext類中,我為我的Users實體添加了一個DbSet:

public virtual IDbSet<User> Users { get; set; }

然後,我運行Add-Migration命令來支持更改。生成後,我註釋掉了代碼並將遷移應用到數據庫中。這會在AspNetUsers表的__MigrationsHistory表中生成一行,但不會嘗試重新創建表。

然後,我能夠成功地與DataLayer EF6項目中的AspNetUsers表交談:)

此外,我現在還可以通過向User.cs類添加屬性並在EF6 Datalayer項目中進行遷移來擴展帶有自定義列的AspNetUsers表。


熱門答案

我最近處理過類似的情況。我遵循這種方法。

我有一個單獨的數據層類庫,它具有與身份相關的存儲庫/存儲,遷移和DbContext。 DbContext從主機項目獲取連接字符串。

.Net Core項目在appSettings.json指定了連接字符串。此連接字符串指向同一數據庫。該項目實現IdentityServer3並充當令牌服務。

.Net 4.5.2項目在web.config指定了連接字符串。這也指向相同的數據庫。此應用程序從.net核心項目獲取令牌,並使用該Bearer Token訪問其他API。

我創建了另一個項目來保留實體,這個項目在.net core.net主機中都被引用。

這樣,我有2個主機項目的公共數據層和2個主機項目的2個不同的服務/業務層。它對我很好。

由於EF 7.0不支持播種,我有一個控制台應用程序,用於將數據播種到數據庫中。甚至這個控制台應用程序也通過數據層訪問同一個數據庫。

因此,3個不同的項目正在訪問同一個數

我無法與公眾分享我的代碼。我希望這有幫助。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow