似乎SaveSaves()仅保存最后添加到表中的对象:
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表最初是空的,因此新手逻辑仍然在学习!!
答案 0 :(得分:1)
您需要为每个插入的类别创建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
表中获得所有新类别。这是初稿,这意味着可以根据需要进一步调整性能。