35
foreach (var item in order.MyFiles)
{
   var newFile = adapter.db.File.CreateObject();

   newFile.Name = item.FileName;

   adapter.db.File.AddObject(newFile);

   adapter.db.SaveChanges();

   item.MyFile.Add(new MyFile { FileID = newFile.FileID });

   adapter.db.SaveChanges();
}

foreach (var item in tempFilesList)
{
    adapter.db.DeleteObject(item);
}

adapter.db.SaveChanges();

そのコードはMyFileテーブル内の行を複製します。たとえば、ループが 3 回繰り返される場合、6 行 (3 x 2* adapter.db.SaveChanges()???)が表示されます。

しかし、1つしかない場合adapter.db.SaveChanges();(最後の1つ)、エラーが発生します

「my_dbModel.FK_MyFile_File」関係のプリンシパル エンドを特定できません。追加された複数のエンティティが同じ主キーを持つ場合があります。

adapter.db.File.AddObject(newFile);その場合、アイテムをに割り当てる前にアイテムをコミットしないことが原因だと思いますitem.MyFile.Add(new MyFile { FileID = newFile.FileID });が、間違っている可能性があります。修正方法はありますか?

4

2 に答える 2

53

変更を保存する前にnewFile.FileID新規を定義する場合は使用できません。MyFile新しいエンティティをデータベースに保存するまで、FileIDはデフォルト(0)です。クラスでのナビゲーションプロパティを使用する必要がありFileますMyFile。EFは関係を検出し、データを適切にコミットします。

次のように行を変更してみてくださいitem.MyFile.Add(new MyFile { FileID = newFile.FileID });

item.MyFile.Add(new MyFile { File = newFile });  

ここで、はエンティティFileで定義されたナビゲーションプロパティです。MyFile

于 2012-08-10T00:15:42.640 に答える
2

これは、同じテーブルへの EDMX の循環参照が原因である可能性があります。

たとえば、EmployeeDepartment が更新しようとしているテーブルであり、主キーが EmployeeDepartmentID であり、それが ID 列であり、自動生成されている場合、EmployeeDepartmentID がそれ自体に参照されているかどうかを EDMX で確認します。その場合は、その foreigh キー参照を右クリックし、[削除] をクリックします。

これは私にとってはうまくいきました。これがあなたにもうまくいくことを願っています。

ありがとう、

ビビン。

于 2014-02-07T22:05:00.630 に答える