2011-05-03 38 views
3

我有一個關於MVC3和EF中的多對多關係的基本問題。 在我的數據庫中,我有文章和標籤(多對多),通過TagArticle表連接到兩個表的外鍵。 在我的MVC項目中,我創建了具有來自文章和標籤的屬性的viewmodel,我想在一個視圖中使用它,允許用戶創建文章併爲其選擇標籤。 如何對該場景進行插入操作? 感謝您的幫助。使用MVC3中的實體框架插入到許多相關的表格和視圖模型

回答

0

像這樣的事情應該「只是工作」:

// get tags by name (tagNames is array of string) 
var tags = (from t in db.Tags where tagNames.Contains(t.Name) select t).ToList(); 

var article = CreateArticleFromPostedForm(...); 

var newTags = from tagName in tagNames.Except(tags.Select(t => t.Name)) select new Tag(tagName); 

// Tags collection should be initialized properly when creating the article 
// NOTE: probably better to add a constructor for Article that accepts a list of Tags 
article.Tags.AddRange(tags.Concat(newTags)); 

db.SaveChanges(); 
0

如果你只需要創建新的文章中,你可以使用這種方法:

  • 在你的表格,你必須張貼的文章,要麼名單分配給物品的標記ID或標記名稱
  • 然後,您可以將新的Article添加到上下文
  • 如果您發佈ID,您必須爲每個標記a創建虛擬對象第二附加到上下文
  • 如果你發佈你必須加載標籤對象從數據庫中每個名字(你需要它的ID)
  • 最後的名字,你可以填寫TagsArticle加入上下文(它必須是作爲用於任何連接或裝載Tags)相同的情況下

因此,它應該是這樣的:

context.Articles.AddObject(article); 
int[] ids = GetIdsFromRequest(); 
foreach(var tag in ids.Select(id => new Tag { Id = id })) 
{ 
    context.Tags.Attach(tag); 
    article.Tags.Add(tag); 
} 

context.SaveChanges(); 

它應該工作,因爲你知道,所有關係到標籤是新的,但一旦你婉t修改文章並更改分配的標籤,您將需要more complicated approach

相關問題