C# 对象是否需要知道它是否';在访问子对象之前加载了延迟
假设我们有一个C# 对象是否需要知道它是否';在访问子对象之前加载了延迟,c#,entity-framework,model-view-controller,C#,Entity Framework,Model View Controller,假设我们有一个Invoice对象,其子对象为InvoiceRow实体框架模型 现在,我们向发票-模型添加一个需要访问行的方法,例如: invoice.Sum() 如果发票未显式加载行,此方法Sum()将失败处理此问题的最佳方法是什么? 加载实体时,是否应该“记住”包含子对象?或者如果null,那么Sum()-方法本身是否应该显式加载孩子?您还可以在Sum()-方法中对数据库执行新的查询,并在其中包含子对象,但如果有未保存的更改,该怎么办?在寻找此类问题的解决方案时,请记住关注点的分离。我不希望
Invoice
对象,其子对象为InvoiceRow
实体框架模型
现在,我们向发票
-模型添加一个需要访问行的方法,例如:
invoice.Sum()
如果发票未显式加载行,此方法Sum()
将失败处理此问题的最佳方法是什么?
加载实体时,是否应该“记住”包含子对象?或者如果
null
,那么Sum()
-方法本身是否应该显式加载孩子?您还可以在Sum()
-方法中对数据库执行新的查询,并在其中包含子对象,但如果有未保存的更改,该怎么办?在寻找此类问题的解决方案时,请记住关注点的分离。我不希望Invoice
需要访问DbContext,但它可以知道是否加载了适当的行(可能通过Any()
)
正如在评论中指出的,它确实可以取决于您的特定用例。您有两个选择:
Invoice
对象本身上有一个Sum()
方法,该方法对当时可用的任何东西求和。如果没有子行,这可能会返回0或抛出,具体取决于您需要什么。是否包括
这里是可选的:如果您的数据相当静态,我会在拉取发票
时包括详细信息。使用数据访问层(或其他等效层),这样就不会以不同的方法从存储中取出发票。如果您的数据经常更改,此方法可能不起作用李>
发票
,负责获取详细信息行并对其求和。这将检查存储库或数据库,以确保其具有最新信息,如果您的数据可能在首次获取发票后发生了更改,则更有用
关于您的最后一个问题,“如果有未保存的更改怎么办?”:您必须在这里做出业务决策。因为这个例子是一张发票,所以我可以看到求和的两个原因:获取一个临时总数(想想访问你的购物车,看看你到目前为止花了多少钱)或者获取最终批准的总数(结账)。首先,可以警告用户存在或可能存在影响总和的未保存更改。第二,您不能允许未保存的更改:您需要一些东西来检查它们。在发票最终确定之前,应强制用户提交或放弃挂起的更改 这取决于你想要什么。两种方法都有效。是否要减少对数据库的查询数?是否要最小化加载的数据?是否要使用Linq to Entities
Sum
方法?这完全取决于您想要什么。我想不出任何方法让Sum()显式加载子对象,因此如果禁用了延迟加载,并且在调用Sum()之前未显式加载子对象然后该方法将失败。@ChrisWyatt您可以执行新的查询,并根据Invoice.Id
@默认值加载Invoice行。@ChrisWyatt不需要Invoice对象引用DbContext吗?@ChrisWyatt不,不需要。我并不是说要为现有的发票
填充发票行
,但您可以从发票中独立加载行,然后按您的意愿对它们求和。基本上var rows=context.InvoiceRows.Where(ir=>ir.InvoiceId==loadedVoice.Id)代码>