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;
}
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;