【发布时间】:2017-12-27 09:22:15
【问题描述】:
我有一个使用 ASP.NET Core / EF Core 构建的 Web 应用程序,其中包含两个实体“Products”和“ProductOptions”(一对多关系)。
当我执行查询以从数据库中检索产品时,有没有办法确定是否包含相关的 ProductOptions(产品的子级)? 我需要区分以下几种情况:
案例1:查询中包含了一个Product的相关ProductOptions,但是没有找到ProductOptions
public Product GetByIdIncludingProductOptions(int id)
{
return DbContext.Products.Include(p => p.ProductOptions).FirstOrDefault(p => p.Id == id);
}
案例 2:一个产品的相关 ProductOptions 根本没有被包含
public Product GetById(int id)
{
return DbContext.Products.FirstOrDefault(p => p.Id == id);
}
【问题讨论】:
-
@S.Akbari 抱歉,我忘了说明我正在使用延迟加载。我将编辑我的问题以使其更准确。这个问题仍然悬而未决。
-
目前EF Core中没有延迟加载,所以问题不清楚。
-
@IvanStoev true,我添加了一些代码示例,希望现在更清楚
-
如何在实体周围创建包装器,其中包含有关查询期间加载的内容的信息?如您所知,GetById 不包含任何内容,而 GetByIdIncludingProductOptions 包含 ProductOptions。使用
.Select(p => new ProductWrapper { Entity = p, OptionsLoaded = true/false });修改查询 -
嗯,不。从某种意义上说,你创造了问题。通过自动初始化列表,您添加了歧义,现在您正试图弄清楚如何删除您添加的歧义。如果您希望开发人员立即知道他们是否忽略了包含,那么您应该不将该属性默认为空列表。添加默认值的唯一原因是它未定义的事实并不重要(显然不是这种情况)。
标签: c# asp.net-core entity-framework-core