49

Entity Framework は ID 列を認識していますか?

SQL Server 2005 Express Edition を使用しており、主キーが ID 列であるテーブルがいくつかあります。これらのテーブルを使用してエンティティ モデルを作成し、モデルをエンティティ データソースと組み合わせて使用​​してフォームビューに結合し、新しいエンティティを作成すると、ID 列の値を入力するよう求められます。フレームワークがID列の値を要求しないようにする方法はありますか?

4

10 に答える 10

66

この投稿がかなり古いことは承知していますが、次に到着する人が「Entity Framework」と「Identity」を Google 検索で聞くのに役立つかもしれません。

「Identity」プロパティが設定されている場合のように、Entity Frameworksはサーバー生成の主キーを尊重しているようです。ただし、アプリケーション側のモデルでは、CreateYourEntityHereメソッドで主キーを指定する必要があります。ここで指定されたキーはSaveChanges()、コンテキストの呼び出し時に破棄されます。

このページでは、これに関する詳細な情報を提供します

于 2008-12-23T09:46:41.057 に答える
5

Entity Framework 5 を使用している場合は、次の属性を使用できます。

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
于 2013-07-19T03:01:41.357 に答える
4

(Is Identity) プロパティが true に設定されるように、ID 列の ID 仕様を設定する必要があります。これは、SSMS のテーブル デザイナーで行うことができます。その後、エンティティ データ モデルの更新が必要になる場合があります。

おそらく、「主キーは ID 列です」と言っているのが意味することか、この手順を見逃している可能性があります。

于 2008-09-23T16:28:14.413 に答える
3

これは私が見た中で最高の答えです。ストレージ レイヤー xml を手動で編集して、デフォルト値が に設定されているStoreGeneratedPattern="Identity"タイプの各主キーに設定する必要があります。UniqueIdentifierNewID()

http://web.archive.org/web/20130728225149/http://leedumond.com/blog/using-a-guid-as-an-entitykey-in-entity-framework-4/

于 2011-06-08T16:28:27.420 に答える
2

C# では、次のようにして認識させることができます。

あなたのFooConfiguration.cs : EntityTypeConfiguration<Foo>

this.Property(x => x.foo).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

次に、それを使用するには、必ずアイテムをコンテキストに挿入し、context.SaveChanges()使用する前に呼び出しx.fooて、更新された自動インクリメント値を取得してください。それ以外の場合x.fooは、0 または null になります。

于 2013-03-19T15:42:04.837 に答える
2

Entity Framework は ID 列を認識して処理できます。

あなたの問題は、EF自体ではなく、生成されたフォームビューである可能性があります。ID 列の入力を挿入フォームから削除してみて、何が起こるか見てみましょう。

于 2008-09-23T12:48:40.637 に答える
2

髪を引き抜く前に他のすべてが失敗した場合は、EntityModel を削除し、SQL Server から再インポートしてみてください。キーと関係を微調整し、「データベースからモデルを更新」機能に依存している場合、私が見つけた RC バージョンにはまだ少しバグがあります - 新しいインポートが役立つかもしれません。

于 2008-09-25T18:33:13.893 に答える
1

エンティティフレームワークは、何らかの理由でIDを完全には理解していません。正しい回避策は、その列のセッターをプライベートに設定することです。これにより、生成されたUIは、プライベートフィールドを設定できないため、ID値を設定してはならないことを認識します。

于 2009-01-06T07:09:08.747 に答える
0

私にとってうまくいったのは、StoreGeneratedPattern が Identity 列の場合に None に設定することでした。これで、すべてが一貫して機能します。これに関する主な問題は、モデルが多数ある場合、モデルの編集が非常に面倒なことです。

于 2011-03-23T14:50:21.780 に答える
0

信じられない。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 が見つかります。たぶんもっと良い方法があるかもしれませんが、コンセプトはそこにあります

于 2012-03-31T17:58:02.597 に答える