2010-07-02 172 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

相关问题