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

时间:2019-01-04 15:26:07

标签: c# entity-framework-core data-modeling 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 ) 
       ...

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

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

1 个答案:

答案 0 :(得分:4)

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

  

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

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


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

  

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

     

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