【问题标题】:Entity Framework auto incrementing field, that isn't the Id实体框架自动递增字段,不是 Id
【发布时间】:2012-05-12 17:47:42
【问题描述】:

我知道这不是最理想的解决方案,但我需要向我的一个 EF Code First 对象添加一个自动递增字段。此列 id 不是 Id,它是一个 guid。

我是否可以在代码中定义自动递增字段,或者自己创建列并在数据库中定义其自动递增工作?

【问题讨论】:

    标签: entity-framework ef-code-first code-first


    【解决方案1】:

    您可以使用DatabaseGenerated(DatabaseGeneratedOption.Identity) 注释该属性。 EF 只允许每个表有一个标识列。

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

    【讨论】:

    • 我看过 DatabaseGeneratedOption.Identity 但我一直很懒,没有读到它,我只是假设它使该列成为 PKey 字段。谢谢,我会试试看的。
    • 这仍然适用于多租户数据库吗?
    • @Ahmad 如果每个租户都有自己的种子,这将不起作用
    • 我需要两者都输入int,但它不适用于您的代码。主键始终为 0。任何想法为什么会这样?
    • 我的 Entity 类与此相同。如果我尝试更新Foo Entity。我收到类似Cannot Update Identity column Bar 的错误。对此有任何想法吗?
    【解决方案2】:

    旧帖子认为我会分享我在 Entity Framework 6.1.3 中发现的内容。

    我使用 C# 和 .NET Framework 4.6.1 创建了一个简单的数据层库,添加了一个简单的存储库/服务类、一个代码优先上下文类并将我的 web.config 文件指向本地 SQL Express 2014 数据库。

    在实体类中,我在 Id 列中添加了以下属性构造函数:

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

    然后我通过在 Visual Studio 2015 包管理器中键入以下内容创建了一个新迁移:

    添加-迁移

    为迁移命名,然后等待创建 DbMigtation 类。编辑类并添加以下 CreateTable 操作:

    CreateTable(
    "dbo.Article",
        c => new
        {
            Id = c.Guid(nullable: false, identity: true),
            Title = c.String(),
            Content = c.String(),
            PublishedDate = c.DateTime(nullable: false),
            Author = c.String(),
            CreateDate = c.DateTime(nullable: false),
        })
        .PrimaryKey(t => t.Id);
    }
    

    上表是一个例子,这里的重点是下面的builder注解:

    nullable: false, identity: true
    

    这告诉 EF 将该列指定为非 nullabe,并且您希望将其设置为由 EF 播种的标识列。

    使用以下命令再次运行迁移:

    update-database
    

    这将运行迁移类首先删除表(Down() 方法)然后创建表(Up() 方法)。

    运行您的单元测试和/或连接到数据库并运行选择查询,您应该会以新的形式看到您的表,添加一些不包括 Id 列的数据,您应该会看到新的 Guid(或您选择的任何数据类型)生成。

    【讨论】:

      【解决方案3】:

      对于那些偶然发现 EF Core 的这个问题的人,您现在可以使用您的模型构建器创建一个自动递增列,如下所示:

      builder.Entity<YourEntity>().Property(e => e.YourAutoIncrementProperty).UseNpgsqlIdentityAlwaysColumn();
      

      参考:https://www.npgsql.org/efcore/modeling/generated-properties.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-20
        • 2011-12-02
        • 2019-01-27
        • 2014-07-20
        • 1970-01-01
        • 1970-01-01
        • 2011-03-12
        • 2016-08-15
        相关资源
        最近更新 更多