web-dev-qa-db-ja.com

Entity Frameworkの自動インクリメントフィールド、つまりIDではありません

これが最も理想的なソリューションではないことはわかっていますが、EF Code Firstオブジェクトの1つに自動インクリメントフィールドを追加する必要があります。この列IDはIDではなく、GUIDです。

とにかくコードで自動増分フィールドを定義することはできますか、列を自分で作成し、DBでその自動増分が機能することを定義しますか?

36
JamesStuddart

DatabaseGenerated(DatabaseGeneratedOption.Identity)でそのプロパティに注釈を付けることができます。 EFでは、テーブルごとに1つのID列のみが許可されます。

public class Foo
{
    [Key]
    public Guid Id { get; set; }

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long Bar { get; set; }
}
59
Eranga

古い投稿は、私が見つけたものを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);
}

上記の表は例です。ここで重要なのは、次のビルダーアノテーションです。

nullable: false, identity: true

これはEFに列をnullabeでないと指定し、EFによってシードされるID列として設定するように指示します。

次のコマンドを使用して移行を再度実行します。

update-database

これにより、移行クラスが実行され、最初にテーブルが削除され(Down()メソッド)、次にテーブルが作成されます(Up()メソッド)。

ユニットテストを実行し、データベースに接続して選択クエリを実行します。新しいフォームにテーブルが表示され、Id列を除くデータが追加され、生成される新しいGUID(または選択したデータタイプ)が表示されます。 。

7
Tahir Khalid