實體框架7數據註釋支持[DatabaseGenerated(DatabaseGeneratedOption.Identity)]在Guid類型主鍵上

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方法中具有如下所示:

    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; }
}

這應該是:

    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; }
}

實體框架7中是否不再支持[DatabaseGenerated(DatabaseGeneratedOption.Identity)] ?或者我錯過了什麼?

一般承認的答案

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將使用該值並將其傳播到數據庫。這將是註釋的預期效果。




許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因