如何使EF-Core為其ID /主鍵使用Guid而不是String

asp.net-core asp.net-identity asp.net-identity-3 entity-framework-core

當我查看ASP.NET 3 Identity時,它使用string而不是Guid作為唯一主鍵。

在我的Entity Framework code first用戶的ApplicationUser類繼承了Identity類

public class ApplicationUser : IdentityUser
{
}

這導致在我創建實體框架遷移時,使用密鑰類型nvarchar(450)而不是uniqueidentifier創建表aspnetusers

當我比較這對ASP.NET Identity 2 ENtity Framework項目它創造的ID字段uniqueidentifier ,而不是nvarchar(450)

我想對於數據庫性能主鍵和uniqueidentifier外鍵會比nvarchar(450)更好

是否有一種方法可以使用唯一鍵Guid而不是stringuniqueidentifier而不是使用ASP.NET Identity 3nvarchar(450)

先前有一個問題如何將String轉換為Guid,但我希望數據庫表Id是Guid。

當長度為nvarchar(128)時,我發現了以前的BETA的另一個問題 。給出的理由是並非所有數據庫都支持Guids,並且它的靈活性也發生了變化。

是否必須有一種簡單的方法從字符串更改為Guid而不重寫整個identity 3

在創建SQL Server數據庫約束時, nvarchar(450)實際上是過度殺傷並提供各種警告。數據庫管理員肯定不會喜歡這些警告。

一般承認的答案

您需要從IdentityUser<TKey>繼承自定義ApplicationUser ,並從IdentityRole<TKey>繼承自定義角色

public class ApplicationUser : IdentityUser<Guid> { }    
public class Role : IdentityRole<Guid> { }

自定義上下文類繼承自IdentityDbContext<ApplicationUser, Role, TKey>並使用流暢的api自動生成guid鍵。

public class ApplicationDbContext : IdentityDbContext<ApplicationUser, Role, Guid>
{
    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        builder.Entity<ApplicationUser>(b =>
        {
            b.Property(u => u.Id).HasDefaultValueSql("newsequentialid()");
        });

        builder.Entity<Role>(b =>
        {
            b.Property(u => u.Id).HasDefaultValueSql("newsequentialid()");
        });
    }
}

然後在Startup中將Identity Service添加到這樣的容器中

services.AddIdentity<ApplicationUser, Role>()
        .AddEntityFrameworkStores<ApplicationDbContext, Guid>()
        .AddDefaultTokenProviders()
        .AddUserStore<UserStore<ApplicationUser, Role, ApplicationDbContext, Guid>> ()
        .AddRoleStore<RoleStore<Role, ApplicationDbContext, Guid>>();

如果尚未創建數據庫,請清除遷移文件夾並運行ef命令


熱門答案

我還沒有搞亂這個例子的遷移(他們可能需要一些調整),但是在這方面,ASP.NET Identity v3比v2更具可擴展性。

以下內容應該為您提供基於Guid主鍵的Identity存儲,用於用戶和角色:

public class ApplicationUser : IdentityUser<Guid>
{
}

public class GuidDataContext :
    IdentityDbContext<ApplicationUser, IdentityRole<Guid>, Guid>
{
}

在你的啟動課程中:

services.AddIdentity<ApplicationUser, IdentityRole<Guid>>(
            identity =>
            {
                // whatever identity options you want
                identity.User.RequireUniqueEmail = true;
                identity.Password.RequiredLength = 8;
            }).
            AddEntityFrameworkStores<GuidDataContext, Guid>().AddDefaultTokenProviders();

同樣,如果您不需要向身份用戶添加任何自定義字段,或自定義您的選項,您可以執行以下操作:

public class GuidDataContext :
    IdentityDbContext<IdentityUser<Guid>, IdentityRole<Guid>, Guid>
{ 
}

在你的創業公司:

services
    .AddIdentity<IdentityUser<Guid>, IdentityRole<Guid>>()
    .AddEntityFrameworkStores<GuidDataContext, Guid>()
    .AddDefaultTokenProviders();


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因