EntityFramework SaveChanges()方法复制DB中的行

时间:2014-03-25 09:26:56

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

我遇到EF问题,当我调用SaveCanges()方法时,它会向DB插入新行2次。这是我的代码:

private void addTagsToTagger(FormCollection form)
{

        char[] delimiter = { ',' };
        List<string> userTags = form["tags"].Split(delimiter).ToList();
        List<Tagger> newItems = new List<Tagger>();
        List<Tagger> changedItems = new List<Tagger>();

        foreach (var tagItem in userTags)
        {
            Tagger tagger = new Tagger() { imageId = Int16.Parse(form["imgId"]), tag = tagItem.ToLower().Trim(), tagCount = 1 };
            Tagger taggerRow;
            using(var ctx = new vestibulyContext())
            {
                taggerRow = ctx.Tagger.FirstOrDefault(t => t.tag == tagger.tag);
            }
            if (taggerRow == null)
            {
                newItems.Add(tagger);
            }

        }

        if (newItems.Count() > 0)
        {
            using (vestibulyContext ctx = new vestibulyContext())
            {
                for (int i = 0; i < newItems.Count(); i++)
                {
                    ctx.Tagger.Add(newItems[i]);
                }
                ctx.SaveChanges();
            }

        }

}

我不知道这有什么问题。感谢您的评论。

更新1:我稍微改写了我的代码,但它没有工作。我不知道是什么问题,因为它只是一个简单的INSERT查询。在num变量中始终是项目数,它们被添加到上下文中,但EF将项目重复保存到DB中。 (学习新框架很难......)

    private void addTagsToTagger(FormCollection form)
    {

        char[] delimiter = { ',' };
        List<string> userTags = form["tags"].Split(delimiter).ToList();

        var ctx = new vestibulyContext();
        for (int i = 0; i < userTags.Count(); i++)
        {
            if(!IssetTagInDb(userTags[i]))
            {
                ctx.Tagger.Add(new Tagger() { imageId = Int16.Parse(form["imgId"]), tag = userTags[i].ToLower().Trim(), tagCount = 1 });
            }
        }
        var num = ctx.SaveChanges();

    }

    private bool IssetTagInDb(string tag)
    {
        using (var ctx = new vestibulyContext())
        {
            Tagger taggerRow = ctx.Tagger.FirstOrDefault(t => t.tag == tag.ToLower().Trim());
            if (taggerRow == null)
            {
                return false;
            }
        }
        return true;
    }

1 个答案:

答案 0 :(得分:0)

taggerRow = ctx.Tagger.FirstOrDefault(t => t.tag == tagger.tag);

您正在跟踪我认为的那些实体!

所以这里每次跟踪两个实体

foreach (var tagItem in userTags)
    {
        Tagger tagger = new Tagger() { imageId = Int16.Parse(form["imgId"]), tag = tagItem.ToLower().Trim(), tagCount = 1 };
        Tagger taggerRow;