gpt4 book ai didi

c# - 加速 Entity Framework 4.2 POCO

转载 作者:太空狗 更新时间:2023-10-29 23:02:11 25 4
gpt4 key购买 nike

我正在使用 Entity Framework 4.2,但我遇到了一个相当严重的性能问题。我正在使用从 DbContext 继承的 POCO 方法,这里是一个解释问题的小示例:

我有一个包含 2 个表的数据库 - A 和 B:

一个

  • AId(整数 - 不为空 - 身份 - 主键)
  • 姓名(nvarchar(50) - 不为空)

B

  • BId(整数 - 不为空 - 身份 - 主键)
  • SomeValue (int - not null)
  • AId (int - not null - 外键连接表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 秒!

如果有任何提示可以使这一切更快发生,我将不胜感激。非常感谢!

最佳答案

导航属性的世界可能是一个痛苦的世界。我们基本上不得不逐步停止使用它们,因为它们会在您背后造成如此多的性能问题(尤其是当您开始附加和分离实体时,但这是另一回事)。

发生的事情是,当您访问 a.Bs 时,它会加载该 A 的所有 B。

在这种特定情况下,如果您实际上不需要 B 的完整列表,而只想添加一个新列表,最好简单地创建一个 B 并将其 AId 设置为 a 的 ID。

关于c# - 加速 Entity Framework 4.2 POCO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8171048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com