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

时间:2016-12-21 13:48:00

标签: c# asp.net sql-server asp.net-mvc entity-framework

当我们运行ASP.NET应用程序并注册用户时,Entity Framework会自动在AspNetUser表中设置唯一ID(PK):

enter image description here

其他AspNetRoles,AspNetUserLogins,AspNetUserRoles也是如此 除了已启用标识的AspNetUserClaims。

任何人都可以解释实体框架如何创建这个唯一的ID吗?如果我们想要在EF中创建我们自己的表格并禁用身份,那么我们如何为主键生成这种Id?

6 个答案:

答案 0 :(得分:21)

此唯一ID由SQL Server在插入时创建。

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

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

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

var id = Guid.NewGuid();

答案 1 :(得分:6)

GUID不是由Entity Framework生成,也不是由SQL生成的。它由身份框架处理。只需导航到IdentityModels.cs

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

此类继承自Microsoft.AspNet.Identity.EntityFramework.IdentityUser,此类的构造函数定义为(Source

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

因此GUID在构造函数中生成。对于其他Identity表也是如此。

注意:数据库中的Id字段为varchar (string)

答案 2 :(得分:3)

EF并没有产生这个价值。这是一个GUID(T-SQL中为uniqueidentifier)值,当一个新行被INSERT时,由SQL Server自动生成。

答案 3 :(得分:2)

在ASP .NET中使用Identity,id在db(uniqueidentifier数据类型)中自动生成。在C#中,您可以使用方法Guid.NewGuid()

生成GUID
  

GUID是一个128位整数(16字节),可以在需要唯一标识符的所有计算机和网络中使用。这样的标识符被复制的可能性非常低。

您可以在此处找到C#T-SQL

答案 4 :(得分:0)

我认为这是SQL-Server的一个特性,而不是EF的特性。 EF使用带有标识的唯一ID字段创建表。 如果你想自己做,你需要一个唯一的id字段。然后,您的对象应具有public class CustomUserNameValidator : UserNamePasswordValidator { public static int IsSuccess = 0; public static int UserId=0; public override void Validate(string userName, string password) { this.IsValidate(username,password); } private int isValidate(string stUserName, string password) { try { LoginUser objUser=DBContext.ValidateUser(stUserName,password); if(objUser!=null) { UserId=objUser.UserId; IsSuccess=1; } } Catch(Exception ex) { Logger.Log(ex); } } } 属性GUID,例如您指定Id

希望有所帮助

答案 5 :(得分:0)

在EF core和poco中:

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