我正在使用Entity Framework 4.2,遇到了一个相当严重的性能问题。我采用了POCO方法,继承自DbContext,并且以下是一个解释问题的小样例:
我有一个包含两个表A和B的数据库:
我从数据库创建edmx并关闭代码生成,然后创建以下类:
现在我只需要做以下事情:
我有一个包含两个表A和B的数据库:
A
- AId(int - 非空 - identity - 主键)
- Name(nvarchar(50)- 非空)
B
- BId(int - 非空 - identity - 主键)
- SomeValue(int - 非空)
- AId(int - 非空 - 外键连接到表A中的AId)
我从数据库创建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 });
在我的四核、4GB RAM的64位Windows 7机器上,将新的B添加到最后一行大约需要6秒钟时间,同时数据库也运行在本地。
真正糟糕的是,它似乎呈指数级恶化,因为如果你将B的行数加倍,它需要近20秒钟的时间!
我非常希望能得到任何加快这一过程的提示。非常感谢!