0

我有一个 SQL 列作为 int 数据类型。

我正在尝试使用实体框架更新条目,将其值设置为 0,但它没有得到更新。提交更改时我也没有收到错误...奇怪。好吧,我更改了标签名称并将计数设置为 0,名称已更新但计数未修改

有任何想法吗?

提前致谢

代码片段:

添加标签 - 增加标签数量:

  Tag tag = _tagsRepository.GetTagByName(TagName);
  if (tag == null)
  {
      tag = new Tag();
      tag.CreateDate = DateTime.Now;
      tag.Name = TagName;
      tag.Count = 1;
  }
  else
  {
      tag.Count += 1;
  }
  tag = _tagsRepository.SaveTag(tag);

从项目中删除标签,更新标签计数

   Tag tag = _tagsRepository.GetTagByName(TagName);
   if (tag != null)
   {
       tag.Count -= 1;
   }
   tag = _tagsRepository.SaveTag(tag);

GetTagByName 方法

    public Tag GetTagByName(string Name)
    {
        Tag result = null;
        using (ISADataContext dc = conn.GetContext())
        {
            result = dc.Tags.Where(t => t.Name == Name).FirstOrDefault();
        }
        return result;
    }

保存标签方法

public Tag SaveTag(Tag tag)
{
    using (ISADataContext dc = conn.GetContext())
    {
        if (tag.TagID > 0)
        {
            dc.Tags.Attach(new Tag { TagID = tag.TagID });
            dc.Tags.ApplyCurrentValues(tag);
        }
        else
        {
            dc.Tags.AddObject(tag);
        }
        dc.SaveChanges();
    }
    return tag;
}

解决方法:

using (ISADataContext dc = conn.GetContext())
{
    if (tag.TagID > 0)
    {
        if (tag.Count == 0)
        {
            Tag t =  dc.Tags.Where( tt=> tt.TagID == tag.TagID).First();
            t.Count = 0;
        }
        else
        {
            dc.Tags.Attach(new Tag { TagID = tag.TagID });
            dc.Tags.ApplyCurrentValues(tag);
        }
    }
    else
    {
        dc.Tags.AddObject(tag);
    }
    dc.SaveChanges();
}
return tag;
4

2 回答 2

0

我遇到了和你一样的问题——除了 0 之外的所有其他值都可以正常工作。我们能得到一些解决方案吗?

编辑:经过一番研究,我找到了解决这个问题的方法。您必须修改此行:

dc.Tags.Attach(new Tag { TagID = tag.TagID });

在存根对象中,添加有问题的属性(在您的情况下为计数)并将其值设置为数据库中永远不可能的值,例如 -2。这样,EF 上下文也会比较附加对象的计数值,并始终知道存在差异。所以你的行变成:

dc.Tags.Attach(new Tag { TagID = tag.TagID, Count = -2 });

我不确定这是否每次都有效,但现在它似乎可以完成这项工作。

于 2014-03-19T14:28:18.470 回答
0

你不应该DataContext在你的场景中包含你的 using 语句。这样做意味着您正在检索一个对象context并尝试将现有对象保存在一个新的context. 这意味着当您尝试在 second 中保存时context,它不知道该对象已经存在于数据库中。

于 2012-04-29T11:48:03.587 回答