sql - foreach 之外的 SaveChanges() 仅保存添加的最后一个对象
问题描述
似乎 SaveChanges() 只保存添加到表中的最后一个对象:
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,如果它还没有在 Category 表中,则添加它,所以它不会再次存储重复项,问题是 Category 表最初是空的,因此新手逻辑,还在学习中!
解决方案
您需要Category
为每个插入的类别创建对象,否则您只有一个一直在编辑的类别对象,因此只有这个(最后一次编辑)将保存到数据库中。
如果要添加所有新类别,Matches
可以CategoryId
使用以下内容:
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();
}
现在,您将Matches
一次性从表中获取所有新类别。这是初稿,这意味着如果需要,可以进一步调整性能。
推荐阅读
- javascript - 如何在 clickfunnels 中单击时将 url 作为变量传递?
- c# - 使用 C#、SQLServer 和 AngularJS 创建在线表格
- javascript - 我如何在 api 调用(特别是谷歌登录)上更新导航栏
- flutter - 想为首次发射建立导览
- android - 为什么我的 action.GET_CONTENT 不工作,但 action.PICK 工作?
- android - 导航图方向构建失败
- python - 使用管道 (|) 归档 CSV,但我在字段中间使用管道
- excel - 从整个工作表(多个表)中清除自动筛选
- django - 如何使用 Django Allauth API 删除用户?
- javascript - 仅以字母开头的正则表达式不起作用