gpt4 book ai didi

c# - 如何使 EF-Core 使用 Guid 而不是字符串作为其 ID/主键

转载 作者:行者123 更新时间:2023-12-02 20:46:20 28 4
gpt4 key购买 nike

当我查看 ASP.NET 3 Identity 时,它使用 string 而不是 Guid 作为唯一主键。

在我的 Entity Framework 代码优先用户的ApplicationUser类中,我继承了Identity类

public class ApplicationUser : IdentityUser
{
}

这会导致当我创建 Entity Framework 迁移时,会使用键类型 nvarchar(450) 而不是 uniqueidentifier 创建表 aspnetusers >

当我将其与 ASP.NET Identity 2 ENtity Framework 项目进行比较时,它创建了 uniqueidentifier 的 ID 字段,而不是 nvarchar (450)

我认为 uniqueidentifier 的数据库性能主键和外键会比 nvarchar(450) 更好

有没有办法使用唯一键Guid而不是stringuniqueidentifier而不是nvarchar(450)ASP.NET Identity 3

有一个previous question如何将字符串转换为 Guid,但我希望数据库表 Id 为 Guid。

我找到了另一个question对于以前的 BETA,长度为 nvarchar(128) 时也是如此。给出的原因是并非所有数据库都支持Guids,并且为了灵 active 而进行了更改。

是否一定有一种简单的方法可以从字符串更改为 Guid,而无需重写整个 identity 3

nvarchar(450) 确实有点过分了,在创建 SQL Server 数据库约束时会给出各种警告。数据库管理员绝对不会喜欢这些警告。

最佳答案

您需要定制ApplicationUser继承自IdentityUser<TKey>和自定义角色继承自 IdentityRole<TKey>

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

自定义上下文类继承自IdentityDbContext<ApplicationUser, Role, TKey>并使用 Fluent api 自动生成 GUID key 。

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()");
});
}
}

然后在启动中将身份服务添加到容器中,如下所示

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

如果您尚未创建数据库,请清除migrations文件夹并运行ef命令

关于c# - 如何使 EF-Core 使用 Guid 而不是字符串作为其 ID/主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37166098/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com