我有一个实体基类,我用它作为我所有实体的基础:
public abstract class EntityBase : IEntity
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id
{
get
{
return _id;
}
set
{
if (_id.Equals(default(Guid)))
_id = value;
if (_id.Equals(value))
return;
throw new InvalidOperationException("Primary Keys cannot be changed.");
}
}
Guid _id = default(Guid);
[Timestamp]
public byte[] RowVersion { get; set; }
}
但[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
有任何影响。
创建的迁移在CreateTable方法中具有如下内容:
columns: table => new
{
Id = table.Column<Guid>(nullable: false),...
这应该是:
Id = c.Guid(nullable: false, identity: true),...
是[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
实体框架7中不再支持?或者我错过了什么?
答案 0 :(得分:3)
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
。
由于EF7针对各种数据库提供商,因此迁移中存储的方式已发生变化。由于并非所有提供程序都支持标识列,因此没有identity
参数。而是将其存储为提供者特定的注释。因此,当列将用作特定于SQL Server的IDENTITY
列时,您将看到以下语法。
Id = table.Column<int>(nullable: false)
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
DatabaseGeneratedOption.Identity
的语义与以前相同。添加新行时,数据库将生成一个值。在针对SQL-Server时,如果在任何整数类型属性上指定,则EF7将为其创建Identity列。由于IDENTITY
无法在非整数或非数字类型上指定,因此对于任何其他类型,都不会有任何此类注释。虽然该属性仍然具有添加新行将生成值的功能。
在您的示例中,属性为Guid
类型,在SQL-Server中转换为uniqueidentifier
类型。无法设置此类型IDENTITY
,因此在生成的迁移中找不到注释。如果您尝试在不指定值的情况下添加记录,则数据库将为您生成一个值。如果您将值显式设置为属性Id
,EF7将使用该值并将其传播到数据库。这将是注释的预期效果。