2011-01-22 14 views
1

私は、Visual Studio 2010のエンティティフレームワーク4.0を使用してプロジェクトを持っているI次のコードを持っている:MyEntitiesは通常のEFのオブジェクトコンテキストをあるEntity Frameworkの4.0挿入新しいオブジェクトエラーが

using (var db = new MyEntities()) 
{ 
    var dbLead = db.Leads.CreateObject(); 
    dbLead.Email = lead.Email; 
    db.Leads.AddObject(dbLead); 
    db.SaveChanges(); 
} 

LeadはEF生成クラスで、データベース内の対応するテーブルにマップされます。上記のコードで割り当てられたEmailプロパティに加えて、LeadクラスはIdプロパティを持っていますが、ここでは明示的に設定していません。期待されているすべてのもの、奇妙なものはまだありません。

db.SaveChanges()への呼び出しで例外が発生しました。「重複する主キー」を問題として挙げています。しかし、DBでは、対応する列が主キーとしてマークされ、.edmxデザイナーでは、対応するプロパティーがEntityKeyとしてtrue、StoreGeneratedPatternがIdentityとしてマークされます。

カップルの質問:

  1. なぜ設計者はStoreGeneratedPatternは、対応する列が主キーに設定されている基礎となる表を想定し、それがクラスを生成し、デフォルトでアイデンティティに設定されているために十分にスマートではないでしょうか?私の場合は、デザイナーのすべてのクラスに入って、すべての主キープロパティにこの値を設定する必要がありました(興味深いことに、EntityKeyはデフォルトでtrueに設定されています)。

  2. まだ動作していません...なぜですか?私はStoreGeneratedPatternをComputedに設定しようとしましたが、運が必要ありません。そうでなければ、Computedに設定して問題を解決した理由が分かりません。

+0

DBMSとは何ですか? –

+0

デフォルトのコード生成テンプレートを使用していますか? –

答えて

3

データベースでId列にYesIsIdentityを設定してみてください。 EF自体がStoreGeneratedPatternIdentityに設定していないことに言及しているので、ここではそれが問題です。

+1

データベースには、主キーでマークされた 'Id'列がありました。あなたのお勧めでは、私は少し深く見て、テーブル自体のアイデンティティ列プロパティが空白であることに気づいたので、私はそれを 'Id'カラムに設定しました。 .edmxデザイナーの 'Lead'クラスを削除し、DBから更新を実行しました。 StoreGeneratedPatternがIdentityに設定された 'Lead'クラスが生成され、今は動作します。それはあなたが「IsIdentity」の意味ですか?私はその名前で何も見なかったので。 – gzak

+0

はい、これは私が意味していたことです(SQL Server Management Studioのやり方を繰り返す)、私が不明な場合は申し訳ありません。いずれにしても、フィールドはDB内の 'ID'ではなく' PK'であったため、EFは同じId値(おそらく0)を繰り返し挿入しようとしたため、失敗しました。 – Yakimych

+0

フィールドを「PK」とすることは、「ID」として扱うこととは異なることを意味していたことに気づいていませんでしたが、これでクリアされました。ありがとう! – gzak

関連する問題