gpt4 book ai didi

entity-framework - Entity Framework 6 延迟加载和查询导航属性

转载 作者:行者123 更新时间:2023-12-02 20:52:14 29 4
gpt4 key购买 nike

触发警告:我是一名前 NHibernate 用户,正在切换到 EF。

刚刚遇到了我对 Entity Framework 6 的第一次重大失望。在 this abstract base class ,我有帐户的基本功能。

一个账户有一组交易。为了确定帐户的可用余额,我只需从总存款中减去总费用和未释放的产权负担。这是与所有类型的帐户相关的纯业务逻辑。

为了获取总金额,我有一些属性可以按类型过滤帐户的交易并对交易金额进行求和。请参阅TotalDepositAmount作为我尝试执行此操作的几种方法的示例。

我在 EF 中使用延迟加载,我期望 EF 做的是向数据库发出查询以获取存款交易的总值(value)。相反,EF 会获取该帐户的所有交易并将它们加载到内存中,然后 linq 过滤它们。 WTF。

我之所以发现这个问题,是因为我在示例应用程序中进行了一些性能测试,并将 30k 笔交易(完全可能的数量)存入一个账户。现在尝试 ToString 我的帐户基本上会使应用程序崩溃......

经过深入研究,我发现查询导航属性的唯一方法是在获取父级或有权访问实体内的 dbcontext 时执行此操作..因此该属性看起来像这样..

public decimal TotalDepositAmount
{
get
{
return context.Entry(this).Reference("Transactions").Query()
.OfType<Deposit>().Sum(d => d.Amount);
}
}

但是,当然,我无权访问我的实体内部的上下文,并且拥有它会完全污染我的实体的纯度......

那么,EF 专家们。我缺少什么。我怎样才能实现拥有纯域实体的目标。我可以使用哪些解决方法或模式?

最佳答案

这假设您的基类交易有一个属性,该属性是存款列表

context.Transactions.Where(x => x.Deposit.Count > 1).Sum(d => d.Amount);

我使用它进行了测试

db.Database.Log = s => System.Diagnostics.Debug.WriteLine($"SQL: {s}");

并将其放在上面一行之前。如果您查看输出,您应该会看到事务受到子选择中的 where 子句的限制。

关于entity-framework - Entity Framework 6 延迟加载和查询导航属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27156888/

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