如何在Entity Framework中的多对多关系中添加和重用对象?

时间:2010-07-02 21:46:24

标签: entity-framework ado.net

我正在开发一个asp.net-mvc项目。

我有一个Items表和一个Tags表。还有一个由两列组成的ItemTags表,设置为复合键,存储前两个表中的Id。

映射到EntityFramework,后一个表可以在表之间进行导航。

当我为特定物品添加新标签时,我使用:

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

我的问题是:如果标签已经添加到Tags表中,并且我有另一个想要重复使用相同标签的Item,会发生什么? 如果我有一个仅使用已在Tags表中的标签的NEW Item会怎样?

使用:

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

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

谢谢!

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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();
                    }
                }
            }