Entity Framework 如何为主键生成 GUID 值?

13
当我们运行ASP.NET应用程序并注册用户时,实体框架会自动在AspNetUser表中设置唯一标识符(主键):

enter image description here

除了启用身份验证的AspNetUserClaims外,其他AspNetRoles、AspNetUserLogins和AspNetUserRoles也是如此。
有人能解释一下实体框架如何创建这个唯一的 Id 吗?如果我们想要在 EF 中创建一个禁用身份验证的自己的表,我们将如何生成这种主键 Id?

你为什么要使用GUID作为主键值呢?它相对于老式的32位或64位整数有一些不足之处。你似乎也把"identity"和"int"混淆了。设置"identity"意味着数据库将为新行生成主键值,而不管类型(只限于支持的类型)。 - CodeCaster
Entity Framework 可以实现这个功能。 - Shivam Sharma
我在回应你的 “如果我们想要创建自己的表格[...]我们该如何生成这种ID?” 问题。为什么要在表格中使用 GUID 作为主键呢? - CodeCaster
6个回答

33

这个独特的ID是在插入时由SQL Server创建的。

如果您想让SQL Server在插入时生成值,您必须在模型中使用以下属性:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public Guid Id { get; set; }

或者,如果您想自己管理Id,请生成它:

var id = Guid.NewGuid();

11

GUID并非由Entity FrameworkSQL生成,而是由Identity框架处理。只需导航至IdentityModels.cs即可。

public class ApplicationUser : IdentityUser
{
   // ...
}

这个类是从Microsoft.AspNet.Identity.EntityFramework.IdentityUser继承的,构造函数在(源代码)中定义

public IdentityUser()
{
    Id = Guid.NewGuid().ToString();
}

因此GUID是在构造函数中生成的。其他身份表格也是如此。

注意:数据库中的ID字段是varchar(字符串)


这种方法使我可以在没有数据库的情况下设置值。对于我的目的来说,这正是我想要的,因为我正在将其序列化为XML文件。 - Paul Hegel

2

EF没有生成那个值。那是一个GUID(在T-SQL中为uniqueidentifier)值,当插入新行时,由SQL Server自动生成。


2
在ASP .NET中使用Identity时,id会自动生成并保存在数据库中(uniqueidentifier数据类型)。在C#中,您可以使用方法Guid.NewGuid()生成GUID。

GUID是一个128位整数(16字节),可用于所有计算机和网络,无论何时需要唯一标识符。这种标识符被重复的概率非常低。

您可以在C#T-SQL中找到更多信息。

1
当用户被创建时,EF是生成这个ID还是由SQL Server自动生成的? - Shivam Sharma

0

在 EF Core 和 POCO 中:

...
.Property(p => p.Id)
    .ValueGeneratedOnAdd()
;

-1

我认为这更多是 SQL-Server 的一个特性,而不是 EF 直接的特性。EF 会创建带有自增长字段的唯一 ID 表。 如果您想手动实现此功能,则需要一个唯一 ID 字段。因此,您的对象应该具有 GUID 属性 Id,您可以为其分配 Guid.NewGuid()

希望能帮到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接