我知道这不是最理想的解决方案,但我需要在我的一个EF Code First对象中添加一个自动递增字段。这列不是Id,这是一个guid。
我有没有在代码中定义自动递增字段,还是自己创建列并在数据库中定义其自动递增工作?
答案 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