我正在开发一个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);
再次确保我没有添加两次相同的标签。如果标签和项目已经在表格中,我如何“制造”它们之间的关系。
谢谢!
答案 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();
}
}
}