2011-02-24 73 views
1

我有一個視圖向用戶顯示一個表單,用戶應該上傳一個文件並選擇與之相關的所有類別。實體框架多對多插入數據時的關係瓶頸

控制器,它負責在提交的數據應該

  • 檢索文件信息和 插入數據的文件類別

  • 檢索相關類別ID和 插入他們以及在表 這是由EF提取的只是 插入文件和類別ID。

這是我的問題控制器只是獲取有關類別的一些信息而不是全部。基本上只需要的ID爲插入

我不能使用

 [HttpPost] 
    public ActionResult SaveFile(File file, List<Category> Checkbox, HttpPostedFileBase FileUpload) 
    { 
     //some stuff 
     //for example got the first category and named it to category1 
     file.Categories.Add(category1) 
    } 

我問一個人,他告訴我,你必須選擇要插入

的類別,這真的是必要的?我只需要一個類別ID和文件ID,使插入我爲什麼要解僱另一個請求到數據庫,我並不真的需要

Entities


我使用

  • EF 4
  • MVC 3

回答

2

最好是第一選擇類別因爲它會爲您節省很多可能的問題,但這不是必需的。您可以使用虛擬類別對象:

var category = new Category { Id = receivedId }; 
    file.Categories.Add(category); 

您將只創建新類別,並且您將設置其PK。現在,你需要處理的文件插入,你必須明確指示的ObjectContext只插入文件(因爲您的類別在數據庫中存在):

context.Files.Attach(file); // now whole object graph is attached but marked as Unchanged 
context.ObjectStateManager.ChangeObjectState(file, EntityState.Added); // mark only file entity as inserted 
context.SaveChanges(); 

你也可以採取相反的方向:

context.Files.AddObject(file); // all objects in object graph are marked for insertion 
foreach (var category in file.Categories) 
{ 
    // you don't want to insert categories again 
    context.ObjectStateManager.ChangeObjectState(category, EntityState.Unchanged); 
} 
context.SaveChanges(); 

這種情況作品如果您知道數據庫中存在所有類別。如果您想通過保存文件將新類別一起插入,則需要先查詢類別或添加有關哪些類別是新的和哪些類別存在的信息。

+0

我還是想在抽象實體「CategoryFile」所以,當我嘗試你的方法的結果是一個例外'無法更新EntitySet的「CategoryFile」,因爲它有一個DefiningQuery並沒有元素中是否存在插入一行元素支持當前的操作。@ – 2011-02-24 13:17:58

+1

@Nadeem:在這種情況下,您的數據模型被錯誤地定義。對於EF,類別和文件之間的聯結表是隻讀的。您可能在該表中缺少主鍵。 – 2011-02-24 13:21:52

+0

真的你是天才:D,那幫了ALOT,謝謝 – 2011-02-24 14:32:48