Sql foreach外部的SaveChanges()只保存最后添加的对象
SaveChanges()似乎只保存添加到表中的最后一个对象:Sql foreach外部的SaveChanges()只保存最后添加的对象,sql,entity-framework,foreach,console-application,Sql,Entity Framework,Foreach,Console Application,SaveChanges()似乎只保存添加到表中的最后一个对象: static void Main(string[] args) { Category c = new Category(); using (GenericDBEntities db = new GenericDBEntities()) { foreach (Match i in db.Matches) {
static void Main(string[] args)
{
Category c = new Category();
using (GenericDBEntities db = new GenericDBEntities())
{
foreach (Match i in db.Matches)
{
if (!db.Categories.Any())
{
c.CategoryInternalId = i.CategoryId;
c.CategoryName = i.CategoryName;
c.SportId = i.SportId;
db.Categories.Add(c);
}
else
{
foreach (Category a in db.Categories)
{
if (i.CategoryId != a.CategoryInternalId)
{
c.CategoryInternalId = i.CategoryId;
c.CategoryName = i.CategoryName;
c.SportId = i.SportId;
db.Categories.Add(c);
}
else
{
return;
}
}
}
}
db.SaveChanges();
我尝试过几种不同的方法,它们都有相同或更少的结果,for循环保存了它们,不管条件是否满足。为什么它只保存匹配表的最后一个对象?我错过了什么
澄清:任务是检查匹配表,该表具有重复的CategoryID,如果它不在类别表中,则添加它,这样它就不会再次存储重复项,问题是类别表最初是空的,因此新手逻辑仍在学习中 您需要为每个插入的类别创建
类别
对象,否则您只有一个一直在编辑的类别对象,因此只有这一个(上次编辑)将保存到数据库中
如果要根据CategoryId
添加Matches
中的所有新类别,可以使用以下方法:
using (GenericDBEntities db = new GenericDBEntities())
{
var newCategories = db.Matches
.Where(m => !db.Categories
.Select(c => c.CategoryInternalId)
.Distinct().Contains(m.CategoryId))
.Select(m => new { m.CategoryId, m.CategoryName, m.SportId })
.GroupBy(m => m.otherid)
.Select(g => g.FirstOrDefault())
.ToList();
foreach (var i in newCategories)
{
var c = new Category()
{
CategoryInternalId = i.CategoryId,
CategoryName = i.CategoryName,
SportId = i.SportId
};
db.Categories.Add(c);
}
db.SaveChanges();
}
现在,您将一次性从
匹配项表中获得所有新类别。这是初稿,意味着性能可以在需要时进一步调整。哇,你做得很好!我以为有一个LINQ的方法可以做到这一点,只是这对我来说仍然是复杂的想法…谢谢,真的很感谢你的帮助!