EFCore-如何从自动加载中排除拥有的对象?

Lup*_*upf 2 c# data-modeling entity-framework-core owned-types

我试图将注意力集中在EF Cores拥有的对象上,以及如何控制何时加载某些数据块。

基本上,我有一堆旧的旧表(有些具有约150列),并希望使用根实体和每个表几个拥有的对象对它们进行建模,以实现更好的细分并捆绑某些功能。示例:存在一个“文章”实体,其中包含基础表中最重要字段的约20个属性。该实体还包含一个OwnedObject“ StorageDetails”,包装了更多字段(以及所有与存储内容有关的功能)。

问题:我找不到控制是否应立即加载拥有对象的方法。对于其中的一些,我希望使用Include()显式加载它们。

public class Article : EntityBase
{  
    public string ArticleNumber { get;set; }

    // Owned object, shares article number as key.
    public StorageDetails StorageStuff { get; set; }

    // An Entity from another table having a foreign key reference 
    public SomeOtherEntity OtherStuff { get; set; }
}

public class StorageDetails : OwnedObject<Article>
{
    public Article Owner { get; set; }
}

// Somewhere during model creation ...
builder.OwnsOne(article => article.StorageStuff);

builder.HasOne(article => article.OtherStuff ) 
       ...
Run Code Online (Sandbox Code Playgroud)

使用OwnsOne定义模型并立即加载文章会加载StorageStuff。要加载OtherThing,我必须在查询中将它添加到Inlcude()中,这基本上是我要为拥有的对象实现的功能。

那可能吗?如果没有,您能指出我什么其他方法?

Iva*_*oev 5

对于拥有的类型-不可能(当前),因为此行为是“设计使然”。并记录在EF Core文档的“ 查询拥有的类型”部分中:

查询所有者时,默认情况下将包括拥有的类型。即使拥有的类型存储在单独的表中,也不必使用Include方法。

说“默认”有点含糊,但是您可以放心地将其始终读为“因为”,因为没有选项或Exclude方法。


由于当前控制加载相关数据的唯一方法是将导航属性设置为真实实体,因此将要控制的类型设置为“真实实体”,即不要将它们标记为拥有,定义显式或影子PK并映射这些“实体”与表格拆分

现在可以将两个或多个实体类型映射到同一表,在该表中将共享主键列,并且每一行将对应于两个或多个实体。

要使用表拆分,必须在共享表的所有实体类型之间配置标识关系(外键属性构成主键):

  • @MichalSznajder 在 5.0+ 中首选的是 `Navigation(...).AutoInclude(false)` 流畅的 API,即使最终在内部它使用了前面提到的相同的元数据 API。然而,我不确定它之后是否适用于拥有的类型,因为它们不能与其所有者分开查询。我的意思是,它们最初不会被加载,但以后不能显式/延迟加载。为了加载它们,必须使用明确的“包含”来重新加载其所有者所拥有的内容。 (2认同)