【发布时间】:2012-05-12 17:47:42
【问题描述】:
我知道这不是最理想的解决方案,但我需要向我的一个 EF Code First 对象添加一个自动递增字段。此列 id 不是 Id,它是一个 guid。
我是否可以在代码中定义自动递增字段,或者自己创建列并在数据库中定义其自动递增工作?
【问题讨论】:
标签: entity-framework ef-code-first code-first
我知道这不是最理想的解决方案,但我需要向我的一个 EF Code First 对象添加一个自动递增字段。此列 id 不是 Id,它是一个 guid。
我是否可以在代码中定义自动递增字段,或者自己创建列并在数据库中定义其自动递增工作?
【问题讨论】:
标签: entity-framework ef-code-first code-first
您可以使用DatabaseGenerated(DatabaseGeneratedOption.Identity) 注释该属性。 EF 只允许每个表有一个标识列。
public class Foo
{
[Key]
public Guid Id { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Bar { get; set; }
}
【讨论】:
int,但它不适用于您的代码。主键始终为 0。任何想法为什么会这样?
Foo Entity。我收到类似Cannot Update Identity column Bar 的错误。对此有任何想法吗?
旧帖子认为我会分享我在 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(或您选择的任何数据类型)生成。
【讨论】:
对于那些偶然发现 EF Core 的这个问题的人,您现在可以使用您的模型构建器创建一个自动递增列,如下所示:
builder.Entity<YourEntity>().Property(e => e.YourAutoIncrementProperty).UseNpgsqlIdentityAlwaysColumn();
参考:https://www.npgsql.org/efcore/modeling/generated-properties.html
【讨论】: