Entity Framework 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メソッドにあります。

columns: table => new
            {
                Id = table.Column<Guid>(nullable: false),...

これは:

Id = c.Guid(nullable: false, identity: true),...

エンティティフレームワーク7では[DatabaseGenerated(DatabaseGeneratedOption.Identity)]はサポートされなくなりましたか?または私は何かを逃していますか?

受け入れられた回答

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]はEF7でサポートされています。

EF7はさまざまなデータベースプロバイダをターゲットにしているため、移行時に格納される方法が変更されています。すべてのプロバイダがID列をサポートするわけではないので、 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はその値を使用してデータベースに伝播します。それは注釈の予想される効果であろう。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ