我有以下代码,使用EF6将数据更新/添加到SQL Server CE数据库,这对于少量记录工作正常。但是当记录量超过1000~2000时,交易变得非常缓慢(10~15秒)。有没有办法优化它?
Database.DefaultConnectionFactory = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0", "", MyProject.ConnectionString);
ProjectContext context = new ProjectContext();
context.Configuration.AutoDetectChangesEnabled = false;
context.Configuration.ValidateOnSaveEnabled = false;
using (var db = new ProjectContext())
{
foreach (var item in MyProject.Brands)
{
if (!db.Brands.Any(i => i.Name == item.Name))
{
// Add
db.Brands.Add(item);
}
else
{
// Update
var found = db.Brands.First(i => i.Name == item.Name);
found = item;
}
}
db.SaveChangesAsync();
答案 0 :(得分:2)
这样您就可以节省50%的Linq查询,并且您的更新可能确实有效(您的MyProject.Brands
不会以任何方式附加到您正在使用的new ProjectContext
found
你从那里提取的是附加的,但在原始代码中,你用yuor item
覆盖了它,这意味着它将被忽略。
context
我完全遗漏了,因为你没有用它做任何事情,因为你的使用无论如何都会创建一个新的ProjectContext
。
using (var db = new ProjectContext())
{
foreach (var item in MyProject.Brands)
{
var found = db.Brands.FirstOrdefault(i => i.Name == item.Name);
if (found == null)
{
// Add
db.Brands.Add(item);
}
else
{
// Update
found.prop1 = item.prop1;
found.prop2 = item.prop2;
// ... etc, for all and any updatable properties
}
}
db.SaveChangesAsync();
}