これは最も理想的な解決策ではありませんが、自分のEFコードファーストオブジェクトの1つに自動インクリメントフィールドを追加する必要があります。この列IDは、IDではなく、GUIDです。Entity Framework自動インクリメントフィールド(Idではありません)
は私がコードに自動インクリメントフィールドを定義するためにとにかくあり、または列を自分で作成し、その自動作業をインクリメントすることをDBに定義するのでしょうか?
これは最も理想的な解決策ではありませんが、自分のEFコードファーストオブジェクトの1つに自動インクリメントフィールドを追加する必要があります。この列IDは、IDではなく、GUIDです。Entity Framework自動インクリメントフィールド(Idではありません)
は私がコードに自動インクリメントフィールドを定義するためにとにかくあり、または列を自分で作成し、その自動作業をインクリメントすることをDBに定義するのでしょうか?
DatabaseGenerated(DatabaseGeneratedOption.Identity)
でそのプロパティに注釈を付けることができます。 EFでは、テーブルごとに単一のID列のみが許可されます。
public class Foo
{
[Key]
public Guid Id { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Bar { get; set; }
}
私は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(または、 )を生成する。
は私がDatabaseGeneratedOption.Identityを見ていたが、TBH、私は怠け者されていたし、それに読み込まhadnt、私はちょうどそれがその列PKEYフィールドを作ったと仮定しました。 ありがとう、私はそれを行かせます。 – JamesStuddart
これはマルチテナントデータベースでも機能しますか? – amd
@Ahmad各テナントが独自のシードを持っている場合は動作しません。 – Eranga