实体框架7数据注释支持[DatabaseGenerated(DatabaseGeneratedOption.Identity)]在Guid类型主键上

时间:2015-12-02 16:41:45

标签: entity-framework-core

我有一个实体基类,我用它作为我所有实体的基础:

    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中不再支持?或者我错过了什么?

1 个答案:

答案 0 :(得分:3)

EF7支持

[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将使用该值并将其传播到数据库。这将是注释的预期效果。