在访问子级之前,对象是否需要知道它是否是延迟加载的

时间:2016-04-26 11:01:10

标签: c# entity-framework model-view-controller

假设我们有一个Invoice个对象,InvoiceRow个子对象作为实体框架模型。

现在我们向需要访问行的Invoice模型添加一个方法,例如:

invoice.Sum()

如果未明确加载发票,则此方法Sum()将失败。 处理此问题的最佳方式是什么?

加载实体时,您是否只需“记住”include子对象?或Sum() - 方法本身是否应null明确加载子项?您还可以在Sum() - 方法中对数据库执行新查询,并在那里包含子对象,但如果有未保存的更改会怎样?

1 个答案:

答案 0 :(得分:1)

在寻找像这样的问题的解决方案时,请记住关注点分离。我不希望Invoice要求访问DbContext,但它可以知道它是否加载了适当的行(可能通过Any())。

正如评论中所指出的,它实际上取决于您的特定用例。你有几个选择:

  1. Sum()对象本身上有一个Invoice方法,它总结了当时可用的内容。如果没有子行,这可能会返回0或抛出,具体取决于您的需要。是否Include这里是可选的:如果您的数据是相当静态的,我会在提取Invoice时包含详细信息。使用数据访问层(或某些等效物),这样您就不会以不同的方式将发票从存储中拉出来。如果您的数据经常更改,则此方法可能无效。
  2. 使用具有Invoice的单独业务对象,并负责获取详细信息行并对其进行求和。这将检查存储库或数据库以确保它具有最新信息,如果您第一次提取Invoice后数据可能已更改,则更有用。
  3. 关于你的上一个问题,"如果有未保存的更改怎么办?":你必须在这里做出商业决定。由于这个例子是一张发票,我可以看到两个理由进行总结:得到一个临时总数(想想访问你的购物车看你到目前为止花了多少钱)或获得最终批准的总数(检查出)。首先,可以警告用户存在或可能存在影响总和的未保存更改。对于第二种情况,您无法允许未保存的更改:您需要检查一些内容。您应该在发票完成之前强制用户提交或放弃挂起的更改。