我试图把头全神贯注于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()中,这基本上是我要为拥有的对象实现的功能。
有可能吗?如果没有,您能指出我什么其他方法?
答案 0 :(得分:4)
对于拥有的类型-不可能(当前),因为此行为是“设计使然”。并记录在EF Core文档的Querying owned types部分:
在查询所有者时,默认情况下将包括拥有的类型。即使拥有的类型存储在单独的表中,也不必使用Include方法。
说“默认”有点含糊,但是您可以放心地将其读为“ always”,因为没有选项或Exclude
方法。
由于当前控制加载相关数据的唯一方法是 real 实体的导航属性,因此请将要控制的类型设置为“真实实体”,即不要将它们标记为拥有,定义显式或影子PK,并使用Table Splitting映射这些“实体”:
现在可以将两个或多个实体类型映射到同一表,在该表中将共享主键列,并且每一行将对应于两个或多个实体。
要使用表拆分标识关系(外键属性构成主键),必须在共享表的所有实体类型之间进行配置: