2012-05-03 31 views
33

これは最も理想的な解決策ではありませんが、自分のEFコードファーストオブジェクトの1つに自動インクリメントフィールドを追加する必要があります。この列IDは、IDではなく、GUIDです。Entity Framework自動インクリメントフィールド(Idではありません)

は私がコードに自動インクリメントフィールドを定義するためにとにかくあり、または列を自分で作成し、その自動作業をインクリメントすることをDBに定義するのでしょうか?

答えて

51

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

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

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

は私がDatabaseGeneratedOption.Identityを見ていたが、TBH、私は怠け者されていたし、それに読み込まhadnt、私はちょうどそれがその列PKEYフィールドを作ったと仮定しました。 ありがとう、私はそれを行かせます。 – JamesStuddart

+0

これはマルチテナントデータベースでも機能しますか? – amd

+0

@Ahmad各テナントが独自のシードを持っている場合は動作しません。 – Eranga

6

私は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 

これはnullabeないよう列をspecifiyするEFを伝えますEFによってシードされるID列として設定する必要があります。

次のコマンドで再び移行を実行します。

update-database 

これは、テーブル(アップ()メソッド)を作成する最初の(ダウン()メソッドを)表をドロップするマイグレーションクラスを実行します。

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

関連する問題