实体框架4.1不会将数据放入SaveChanges()的数据库中

时间:2011-10-03 04:05:57

标签: c# asp.net-mvc entity-framework dbcontext

使用新的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表

对此有任何解释吗?

1 个答案:

答案 0 :(得分:3)

有些事情。一,你做错了:

  

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

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

第二件事 - 您的代码不仅无效(您点击了两次db),而且还有错误。你检查数据库的名称,假设它不存在,所以你添加一个标签,然后检查相同的名称,它仍然不存在,所以你再次添加它!

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