2012-08-09 19 views
29
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×2 * adapter.db.SaveChanges() ???)C#無法確定的關係的主端

但是,如果我只有一個adapter.db.SaveChanges();(最後一個),我得到錯誤

無法確定'my_dbModel.FK_MyFile_File'關係的主體端。多個添加的實體可能具有相同的主鍵。

我想這是造成的在那種情況下,不會將這些assinging到item.MyFile.Add(new MyFile { FileID = newFile.FileID });前提交adapter.db.File.AddObject(newFile);項目,但我可能是錯的,任何想法如何解決呢?

回答

45

在保存更改之前定義新的MyFile時,不能使用newFile.FileID。在將新實體保存在數據庫中之前,FileID是默認值(0)。您需要在MyFile課程中使用導航屬性File。 EF將檢測關係並適當地提交數據。

嘗試改變線item.MyFile.Add(new MyFile { FileID = newFile.FileID });用:

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

其中FileMyFile實體中定義的導航屬性。

+2

你已經保存了我的夜晚,非常感謝:) – Tony 2012-08-10 00:27:02

+0

解決了我的問題呢! – HuckIt 2013-05-15 13:17:12

3

這可能是因爲EDMX中的循環引用回到了同一張表。

意味着,例如,如果EmployeeDepartment是,你要更新的表和主鍵是EmployeeDepartmentID,如果它是標識列和自動生成的,請在EDMX的EmployeeDepartmentID是否引用回自己。如果是這樣,請右鍵單擊該外鍵參考,然後單擊刪除。

這對我有用,我希望這也適用於你。

謝謝,

比賓。

+0

所以你說DONT包括自我參考? – 2014-07-14 20:39:59

相關問題