2010-07-02 70 views
0

我正在開發一個asp.net-mvc項目。如何在Entity Framework中以多對多關係添加和重用對象?

我有一個物品表和一個標籤表。還有一個ItemTags表,由兩列組成,設置爲複合鍵,存儲前兩個表中的Id。

映射到EntityFramework後面的表使得能夠在表格之間導航。

當我添加一個新的標籤爲某個特定項目使用:

db.Items.Where(id => id.Id == newItem.Id).First().Tags.Add(newTag); 

我的問題是:如果標籤在標籤表中已經加入,會發生什麼,而我還有一個項目想重用相同的標籤? 如果我有一個僅使用標籤表中已有標籤的新項目,會發生什麼情況?

是否使用:

db.Items.Where(id => id.Id == newItem.Id).First().Tags.Add(newTag); 

AGAIN確保我沒有相同的標籤添加兩次。我如何「製造」標籤和物品之間的關係,如果它們都已在表格中。

謝謝!

回答

0

所以...找到答案:(不知道是否有更好的方法來做這件事......) 這是相同的Add()方法,它既執行「添加如果項目是新的」和「如果項目已經在那裏添加」。

foreach (var incomingTag in tagList) 
      { 
       if (!String.IsNullOrEmpty(incomingTag)) 
       { 
        //this is where we check if there is a tag with the same name in the Tags table 
        var existingTag = db.Tags.Where(dbTag => dbTag.Name == incomingTag.ToLower()).FirstOrDefault(); 
        if (existingTag == null) 
        { 
         //if there is no such Tag then we create a new one and add it 
         var newTag = new Tag { Name = incomingTag }; 
         db.Items.Where(id => id.Id == newItem.Id).First().Tags.Add(newTag); 
         db.SaveChanges(); 
        } 
        else 
        { 
         //if there is a tag with that name we "add" the old tag and by doing this we update the relationship 
         db.Items.Where(id => id.Id == newItem.Id).First().Tags.Add(existingTag); 
         db.SaveChanges(); 
        } 
       } 
      } 
0

實體框架不會確保您不會添加兩次相同的標記。你必須檢查你自己。實體框架不知道「重複標籤」是什麼意思。

您可以在多對多映射表中的外鍵列上拋出一個複合鍵,這樣如果相同標記被添加兩次,則拋出異常。您仍然必須處理異常,以便與手動檢查重複項的代碼量幾乎相同。

+0

好的。感謝您的答覆。我還有一件事情還不清楚。 如果我有一個項目和標籤已被添加到他們各自的表。我如何在它們之間建立關係? – unmircea 2010-07-04 14:16:19

+0

@basilmir你的代碼應該工作得很好。只需將標籤添加到Item.Tags集合。反向應該也可以。 Tags.Items.Add(商品) – jfar 2010-07-04 14:32:42

+0

感謝您的回覆。我正在尋找的東西是這樣的: Tag relatedTag = new Tag {Id = 2}; Item relatedItem = new Item {Id = 10}; db.AttachTo(「Tags」,relatedTag); db.AttachTo(「Items」,relatedItem); db.SaveChanges(); 這是否會創建我的表之間的關係並更新兩者之間的表? – unmircea 2010-07-05 14:36:29

相關問題