[英]Slow updates with Entity Framework 4.3 and SQL Server Compact Edition 3.5
我正在开发使用SQL Server Compact Edition数据库和Entity Framework的WPF应用程序,但是更新和删除的性能确实很慢。 因此,我创建了一个简单的Foobar
控制台应用程序(如下),并遇到了同样的问题。
我知道实体框架会产生一些开销,并且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的时间几乎翻倍)
经过测试
我怀疑您的create函数会更快,因为它只是创建10000个本地对象,然后将它们全部提交到数据库中,而您的delete和update函数都会在更改之前从数据库中查询一项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.