2

このMSDNドキュメントからの言い換え...

INSERTステートメントはEntityFrameworkによって生成され、ObjectContextでSaveChangesが呼び出されたときにデータソースで実行されます。

INSERT操作が成功すると、サーバーで生成された値がObjectStateEntryに書き戻されます。SaveChangesの実行の最後にAcceptChangesが自動的に呼び出されると、サーバーで生成された新しい値を使用して永続的なEntityKeyが計算されます。

これは私のコードでは発生していないようです。を呼び出すとObjectContext.SaveChanges()、次の値UpdateExceptionがスローされます。InnerException.Message

「重複するキー値が一意性制約student_term_data_pkeyに違反しています」

問題のあるコードは次のとおりです。

using (DataAccessLayerEntities context = new DataAccessLayerEntities()) {
     StudentTermData mostCurrent = new StudentTermData() {
          // Foreign keys:    
          StudentId = studentId,
          TermId = currentTerm.Id,

          // Non-nullable properties:
          SponsorCode = string.Empty,
          AdmissionNumber = string.Empty,
          Expiration = string.Empty
     };

     context.StudentTermDatas.AddObject(mostCurrent);
     context.SaveChanges();  // UpdateException occurs here.
}

StudentTermData.IdエンティティデータモデルでEntityKeyとしてマークされていることを確認しました。誰かアイデアや提案はありますか?

4

2 に答える 2

2

この問題は、EFデザイナーがSSDLにStoreGeneratedPattern属性を設定しないEF4のバグが原因で発生しました。この問題は、このブログこのMicrosoftConnectチケットに記載されています。

解決策は、モデルの.edmlファイルをテキストエディターで開き、<EntityType Name="student_term_data">XMLタグを見つけStoreGeneratedPattern="Identity"て、EntityKeyとして使用されているプロパティタグに追加することでした。

  <EntityType Name="student_term_data">
     <Key><PropertyRef Name="id" /></Key>
     <Property Name="id" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
     ...
  </EntityType>

次に、EFデザイナーでモデルを再度開き、小さな変更を加えて(エンティティの位置を移動して)、保存しました。これにより、コードジェネレーターが実行され、おそらくCDSLがSSDLと同期されました。

これで、コードは期待どおりに実行されます。

于 2010-09-10T18:29:27.547 に答える
0

編集

挿入しようとしている場合は、PKフィールドに入力しないでください(StudentIDだと思います)。

于 2010-09-07T18:40:36.710 に答える