我正在开发一个使用SQL Server Compact Edition数据库和Entity Framework的WPF应用程序,但是我的更新和删除性能非常低。所以我创建了一个简单的Foobar
控制台应用程序(如下所示)并遇到了同样的问题。
据我所知,Entity Framework会产生一些开销,而SQL Server Compact Edition比常规SQL Server慢。但是INSERT
和UPDATE/DELETE
之间的差异是多少?
主要
public static void CreateFoobars()
{
DateTime start = DateTime.Now;
for (int i = 0; i < 10000; i++)
{
Foobar foobar = new Foobar();
foobar.FoobarID = i;
foobar.Column1 = "Column1";
foobar.Column2 = "Column2";
foobar.Column3 = "Column3";
foobar.Column4 = "Column4";
_localRepository.CreateFoobar(foobar);
}
bool result = _localRepository.Save();
TimeSpan timeSpan = CalculateTimeSpan(start, DateTime.Now);
Console.WriteLine("Created Foobars? {0}, Time: {1}", result, timeSpan);
}
public static void CountFoobars()
{
Console.WriteLine("Count Foobars: {0}", _localRepository.GetAllFoobars().Count());
}
public static void UpdateFoobars()
{
DateTime start = DateTime.Now;
for (int i = 0; i < 10000; i++)
{
Foobar foobar = new Foobar();
foobar.FoobarID = i;
foobar.Column1 = "Column11";
foobar.Column2 = "Column22";
foobar.Column3 = "Column33";
foobar.Column4 = "Column44";
_localRepository.UpdateFoobar(foobar);
}
bool result = _localRepository.Save();
TimeSpan timeSpan = CalculateTimeSpan(start, DateTime.Now);
Console.WriteLine("Updated Foobars? {0}, Time: {1}", result, timeSpan);
}
public static void DeleteFoobars()
{
DateTime start = DateTime.Now;
for (int i = 0; i < 10000; i++)
{
_localRepository.DeleteFoobar(i);
}
bool result = _localRepository.Save();
TimeSpan timeSpan = CalculateTimeSpan(start, DateTime.Now);
Console.WriteLine("Deleted Foobars? {0}, Time: {1}", result, timeSpan);
}
存储库
public IQueryable<Foobar> GetAllFoobars()
{
return _entities.Foobars;
}
public Foobar GetFoobar(int foobarID)
{
return _entities.Foobars.ByFoobarID(foobarID).FirstOrDefault();
}
public bool CreateFoobar(Foobar foobar)
{
try
{
_entities.AddToFoobars(foobar);
}
catch (Exception e)
{
}
return false;
}
public bool UpdateFoobar(Foobar foobar)
{
try
{
Foobar f = this.GetFoobar(foobar.FoobarID);
if (f != null)
{
f.Column1 = foobar.Column1;
f.Column2 = foobar.Column2;
f.Column3 = foobar.Column3;
f.Column4 = foobar.Column4;
return true;
}
}
catch (Exception e)
{
}
return false;
}
public bool DeleteFoobar(int foobarID)
{
try
{
Foobar f = this.GetFoobar(foobarID);
if (f != null)
{
_entities.DeleteObject(f);
return true;
}
}
catch (Exception e)
{
}
return false;
}
public bool Save()
{
try
{
this.Context.SaveChanges();
return true;
}
catch (Exception e)
{
}
return false;
}
结果(在带有SSD和16 RAM的i7上,旧版C2D的时间几乎翻倍)
测试
答案 0 :(得分:0)
我怀疑你的创建函数更快,因为它只是创建了10000个本地对象,然后将它们全部一步提交到数据库,而删除和更新函数都在更改之前从数据库中查询一个项目。