【问题标题】:How does Entity Framework generate a GUID for a primary key value?Entity Framework 如何为主键值生成 GUID?
【发布时间】:2017-05-06 23:13:24
【问题描述】:

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

对于其他 AspNetRoles、AspNetUserLogins、AspNetUserRoles 也是如此 除了启用了身份的 AspNetUserClaims。

谁能解释实体框架是如何创建这个唯一 ID 的?如果我们想创建自己的表,在 EF 中禁用了标识,我们将如何为主键生成这种 Id?

【问题讨论】:

  • 为什么您想使用 GUID 作为主键值?与旧的 32 位或 64 位整数相比,它有很多缺点。您似乎也将“身份”与“int”混淆了。设置“身份”意味着数据库将为新行生成主键值,而不管类型如何(但仅适用于支持的类型)。
  • 实体框架会这样做。
  • 我正在回复您的 “如果我们想创建自己的表 [...] 我们将如何生成这种 Id?”。为什么要使用 GUID 作为表的 PK?

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


【解决方案1】:

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

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

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

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

var id = Guid.NewGuid();

【讨论】:

    【解决方案2】:

    EF 不会产生该值。这是一个 GUID(T-SQL 中的uniqueidentifier)值,在插入新行时由 SQL Server 自动生成。

    【讨论】:

      【解决方案3】:

      我认为这更像是 SQL-Server 的一个特性,而不是 EF 的直接特性。 EF 使用带有标识的唯一 ID 字段创建表。 如果您想自己执行此操作,则需要一个唯一 ID 字段。然后,您的对象应该有一个 GUIDproperty Id,例如,您将其分配为 Guid.NewGuid()

      希望有帮助

      【讨论】:

        【解决方案4】:

        在 ASP .NET 中使用Identity,id 会在 db 中自动生成(唯一标识符数据类型)。在 C# 中,您可以使用 Guid.NewGuid() 方法生成 GUID

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

        在这里您可以找到C#T-SQL

        【讨论】:

        • 那么当创建用户时,EF会生成这个id还是由sql server自动生成?
        【解决方案5】:

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

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

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

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

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

        注意:ID 字段在数据库中为varchar (string)

        【讨论】:

        • 这种方法使得我可以在没有数据库的情况下设置值。我的目的就是我想要的,因为我是serializing to xml file
        【解决方案6】:

        在 EF 核心和 poco 中:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-02
          • 2020-06-09
          • 1970-01-01
          • 2015-08-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多