代码之家  ›  专栏  ›  技术社区  ›  unom

如何在实体框架中添加和重用多对多关系中的对象?

  •  0
  • unom  · 技术社区  · 14 年前

    我正在开发一个ASP.NET-MVC项目。

    我有一个项目表和一个标签表。还有一个由两列组成的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);
    

    再次确保我没有添加相同的标签两次。如果标签和项目都已经在表中,那么如何“使”它们之间的关系。

    谢谢您!

    2 回复  |  直到 14 年前
        1
  •  0
  •   John Farrell    14 年前

    实体框架无法确保您不会两次添加相同的标记。你必须检查一下自己。实体框架不知道您所说的“重复标记”是什么意思。

    您可以在多对多映射器表中的外键列上抛出一个复合键,因此如果同一个标记被添加两次,则会引发异常。您仍然需要处理这个异常,因此它的代码量几乎与手动检查重复的代码量相同。

        2
  •  0
  •   unom    14 年前

    所以…找到了答案:(不知道有没有更好的方法来做这个…) 这是相同的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();
                        }
                    }
                }