1

我在使用新的 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);
    }
}

如果 Tag this 这样的名称已经存在,则应该检查数据库,并且我在这段代码中使用了这个函数:

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”时会导致错误“序列包含多个元素”,这不应该发生,因为我在添加任何新标签之前检查了整个数据库,使用此函数进行检查如果标签已经在数据库中。

从我在代码中看到的情况来看,发生这种情况的原因是,即使我将我从数据库中获取的 Tag 对象添加到 Picture 中,它稍后仍会将其作为新对象添加到 Tags 表中。

对此有什么解释吗?

4

1 回答 1

3

几件事情。一,你做错了:

这不应该发生,因为我在添加任何新标签之前检查了整个数据库,使用这个函数来检查标签是否已经在数据库中。

数据库能够检查此类约束,因此请使用数据库,而不是代码。

第二件事——你的代码不仅效率低下(你打了 db 两次)而且也有问题。您对照数据库检查名称,假设它不存在,所以您添加一个标签,然后您检查相同的名称,它仍然不存在,所以您再次添加它!

您保存它,然后您无法获得单条记录,因为您只保存了 2 条同名记录。

于 2011-10-03T05:44:23.117 回答