使用新的Entity Framework 4.1时遇到问题。我几天前开始测试它,我仍然是整个POCO概念和新API的新手。
无论如何,在做一些编码的时候我创造了这样的东西:
public Tag GetTagWithName(string name)
{
if (db.Tags.SingleOrDefault(q => q.Name == name) == null)
{
return new Tag { Name = name };
}
else
{
return db.Tags.SingleOrDefault(q => q.Name == name);
}
}
如果这个名称已经存在,我应该在数据库中检查,并且我在这段代码中使用了这个函数:
if (tags != null)
{
foreach (HtmlNode tagNode in tags)
{
string tagString = tagNode.InnerText.Remove(0, 1);
Tag tag = TagRep.GetTagWithName(tagString);
pic.Tags.Add(tag);
}
}
if (context.Pictures.Any(q => q.Link == pic.Link))
{
continue;
}
else
{
context.Pictures.Add(pic);
}
context.SaveChanges();
基本上是将标签添加到新创建的照片中,检查照片是否已经存在于数据库中,如果没有将其添加到数据库中,并在每张照片后调用SaveChanges()。
我的问题是,在执行函数GetTagWithName导致错误“序列包含多个元素”时获取“SingleOrDefault”,这不应该发生,因为我在添加任何新标记之前检查整个数据库,使用此用于检查标签是否已在DB中的功能。
从我在代码中看到的情况发生的情况是因为这样的事实,即使我添加了Picture从数据库获取的Tag对象,它仍然在以后将它作为新对象添加到Tags表
对此有任何解释吗?
答案 0 :(得分:3)
有些事情。一,你做错了:
这不应该发生,因为我之前检查了整个数据库 添加任何新标签,使用此功能检查标签是否已经存在 在DB。
数据库能够检查这些约束,因此请使用数据库,而不是代码。
第二件事 - 您的代码不仅无效(您点击了两次db),而且还有错误。你检查数据库的名称,假设它不存在,所以你添加一个标签,然后检查相同的名称,它仍然不存在,所以你再次添加它!
您保存它,然后您无法获得单个记录,因为您刚刚保存了2个同名记录。