我遇到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;
}
答案 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;