EntityFramework SaveChanges()方法在数据库中复制行

本文关键字:数据库 复制 方法 SaveChanges EntityFramework | 更新日期: 2023-09-27 17:52:52

我有一个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;
    }

EntityFramework SaveChanges()方法在数据库中复制行

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;