假设我们有一个Invoice
个对象,InvoiceRow
个子对象作为实体框架模型。
现在我们向需要访问行的Invoice
模型添加一个方法,例如:
invoice.Sum()
如果未明确加载发票,则此方法Sum()
将失败。 处理此问题的最佳方式是什么?
加载实体时,您是否只需“记住”include
子对象?或Sum()
- 方法本身是否应null
明确加载子项?您还可以在Sum()
- 方法中对数据库执行新查询,并在那里包含子对象,但如果有未保存的更改会怎样?
答案 0 :(得分:1)
在寻找像这样的问题的解决方案时,请记住关注点分离。我不希望Invoice
要求访问DbContext,但它可以知道它是否加载了适当的行(可能通过Any()
)。
正如评论中所指出的,它实际上取决于您的特定用例。你有几个选择:
Sum()
对象本身上有一个Invoice
方法,它总结了当时可用的内容。如果没有子行,这可能会返回0或抛出,具体取决于您的需要。是否Include
这里是可选的:如果您的数据是相当静态的,我会在提取Invoice
时包含详细信息。使用数据访问层(或某些等效物),这样您就不会以不同的方式将发票从存储中拉出来。如果您的数据经常更改,则此方法可能无效。 Invoice
的单独业务对象,并负责获取详细信息行并对其进行求和。这将检查存储库或数据库以确保它具有最新信息,如果您第一次提取Invoice
后数据可能已更改,则更有用。关于你的上一个问题,"如果有未保存的更改怎么办?":你必须在这里做出商业决定。由于这个例子是一张发票,我可以看到两个理由进行总结:得到一个临时总数(想想访问你的购物车看你到目前为止花了多少钱)或获得最终批准的总数(检查出)。首先,可以警告用户存在或可能存在影响总和的未保存更改。对于第二种情况,您无法允许未保存的更改:您需要检查一些内容。您应该在发票完成之前强制用户提交或放弃挂起的更改。