Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对象是否需要知道它是否';在访问子对象之前加载了延迟_C#_Entity Framework_Model View Controller - Fatal编程技术网

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)