【发布时间】:2011-11-17 16:51:00
【问题描述】:
我使用的是 Entity Framework 4.2,但我遇到了相当严重的性能问题。我正在使用 POCO 方法,从 DbContext 继承,这是一个解释问题的小示例:
我的数据库有 2 个表 - A 和 B:
一个
- AId(int - 非空 - 标识 - 主键)
- 名称(nvarchar(50) - 非空)
B
- BId(int - 非空 - 标识 - 主键)
- SomeValue(int - 非空)
- AId(int - 非空 - 连接到表 A 中的 AId 的外键)
A 中有一行(1,'Test'),B 有 6000 行(SomeValue 只是 0 到 5999 之间的一个数字)——所有这些都通过外键列引用 A 行。
我从数据库创建一个 edmx 并关闭代码生成。然后我创建以下类:
public class DatabaseContext : DbContext
{
public DatabaseContext(string name) : base(name)
{
Configuration.AutoDetectChangesEnabled = false;
As = Set<A>();
Bs = Set<B>();
}
public DbSet<A> As { get; private set; }
public DbSet<B> Bs { get; private set; }
}
public class A
{
public virtual int AId { get; set; }
public virtual string Name { get; set; }
public virtual ICollection<B> Bs { get; private set; }
public void AddB(B b)
{
if (b == null)
{
throw new ArgumentNullException("b");
}
if (Bs == null)
{
Bs = new List<B>();
}
if (!Bs.Contains(b))
{
Bs.Add(b);
}
b.A = this;
}
}
public class B
{
public virtual int BId { get; set; }
public virtual A A { get; set; }
public virtual int SomeValue { get; set; }
}
现在我只需执行以下操作:
var ctx = new DatabaseContext("ScalabilityTestEntities");
var a = ctx.As.FirstOrDefault();
a.Bs.Add(new B { SomeValue = 987 });
最后一行(我添加一个新的 B)在我的四核、4gb RAM 64 位 Windows 7 机器上花费了大约 6 秒的时间,并且数据库在本地运行。
真正糟糕的是它似乎会以指数方式降低性能,因为如果将 B 中的行数增加一倍,则需要接近 20 秒!
我非常感谢任何能让这件事更快发生的提示。非常感谢!
【问题讨论】:
标签: c# .net performance entity-framework