实体框架自动递增字段,即不是Id

时间:2012-05-03 08:14:28

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

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

我有没有在代码中定义自动递增字段,还是自己创建列并在数据库中定义其自动递增工作?

3 个答案:

答案 0 :(得分:58)

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

public class Foo
{
    [Key]
    public Guid Id { get; set; }

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long Bar { get; set; }
}

答案 1 :(得分:7)

老帖子以为我会分享我在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);
}

上表是一个示例,此处的关键点是以下构建器注释:

nullable: false, identity: true

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

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

update-database

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

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

答案 2 :(得分:0)

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

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

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