Entity Framework は ID 列を認識していますか?
SQL Server 2005 Express Edition を使用しており、主キーが ID 列であるテーブルがいくつかあります。これらのテーブルを使用してエンティティ モデルを作成し、モデルをエンティティ データソースと組み合わせて使用してフォームビューに結合し、新しいエンティティを作成すると、ID 列の値を入力するよう求められます。フレームワークがID列の値を要求しないようにする方法はありますか?
Entity Framework は ID 列を認識していますか?
SQL Server 2005 Express Edition を使用しており、主キーが ID 列であるテーブルがいくつかあります。これらのテーブルを使用してエンティティ モデルを作成し、モデルをエンティティ データソースと組み合わせて使用してフォームビューに結合し、新しいエンティティを作成すると、ID 列の値を入力するよう求められます。フレームワークがID列の値を要求しないようにする方法はありますか?
この投稿がかなり古いことは承知していますが、次に到着する人が「Entity Framework」と「Identity」を Google 検索で聞くのに役立つかもしれません。
「Identity」プロパティが設定されている場合のように、Entity Frameworksはサーバー生成の主キーを尊重しているようです。ただし、アプリケーション側のモデルでは、CreateYourEntityHere
メソッドで主キーを指定する必要があります。ここで指定されたキーはSaveChanges()
、コンテキストの呼び出し時に破棄されます。
このページでは、これに関する詳細な情報を提供します。
Entity Framework 5 を使用している場合は、次の属性を使用できます。
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
(Is Identity) プロパティが true に設定されるように、ID 列の ID 仕様を設定する必要があります。これは、SSMS のテーブル デザイナーで行うことができます。その後、エンティティ データ モデルの更新が必要になる場合があります。
おそらく、「主キーは ID 列です」と言っているのが意味することか、この手順を見逃している可能性があります。
これは私が見た中で最高の答えです。ストレージ レイヤー xml を手動で編集して、デフォルト値が に設定されているStoreGeneratedPattern="Identity"
タイプの各主キーに設定する必要があります。UniqueIdentifier
NewID()
C# では、次のようにして認識させることができます。
あなたのFooConfiguration.cs : EntityTypeConfiguration<Foo>
:
this.Property(x => x.foo).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
次に、それを使用するには、必ずアイテムをコンテキストに挿入し、context.SaveChanges()
使用する前に呼び出しx.foo
て、更新された自動インクリメント値を取得してください。それ以外の場合x.foo
は、0 または null になります。
Entity Framework は ID 列を認識して処理できます。
あなたの問題は、EF自体ではなく、生成されたフォームビューである可能性があります。ID 列の入力を挿入フォームから削除してみて、何が起こるか見てみましょう。
髪を引き抜く前に他のすべてが失敗した場合は、EntityModel を削除し、SQL Server から再インポートしてみてください。キーと関係を微調整し、「データベースからモデルを更新」機能に依存している場合、私が見つけた RC バージョンにはまだ少しバグがあります - 新しいインポートが役立つかもしれません。
エンティティフレームワークは、何らかの理由でIDを完全には理解していません。正しい回避策は、その列のセッターをプライベートに設定することです。これにより、生成されたUIは、プライベートフィールドを設定できないため、ID値を設定してはならないことを認識します。
私にとってうまくいったのは、StoreGeneratedPattern が Identity 列の場合に None に設定することでした。これで、すべてが一貫して機能します。これに関する主な問題は、モデルが多数ある場合、モデルの編集が非常に面倒なことです。
信じられない。Intellisensing ItemCollection は、SaveChanges の後に ID = 0 の単一のアイテムを生成します。
Dim ItemCollection = From d In action.Parameter
Select New STOCK_TYPE With {
.Code = d.ParamValue.<Code>.Value,
.GeneralUseID = d.ParamValue.<GeneralUse>.Value,
}
GtexCtx.STOCK_TYPE.AddObject( ItemCollection.FirstOrDefault)
GtexCtx.SaveChanges()
私が何をしようと。モデルの削除を含む 8 時間後、EDMX の XML の構築と再構築、実験、編集を 35 回行い、SQL Server データベース全体をほぼ削除するところまで来ました。36回目のコンパイルで、この唖然としたソリューションが機能しました
Dim abc = ItemCollection.FirstOrDefault
GtexCtx.STOCK_TYPE.AddObject(abc)
GtexCtx.SaveChanges()
abc.ID yield 41 (必要な ID)
編集: AddObject をループして ID を取得するための簡単なコードを次に示します。
Dim listOfST As List(Of STOCK_TYPE) = ItemCollection.ToList()
For Each q As STOCK_TYPE In listOfST
GtexCtx.STOCK_TYPE.AddObject(q)
Next
GtexCtx.SaveChanges()
...more code for inter-relationship tables
SaveChanges の後に Intellisence listOfST を試すと、更新された ID が見つかります。たぶんもっと良い方法があるかもしれませんが、コンセプトはそこにあります