繁体   English   中英

使用TPC时,实体框架代码如何首先从基类集中找到类型化的实体

[英]How Does Entity Framework Code First Find Typed Entities From A Base-Class Set When Using TPC

因此,这个问题听起来有些深奥,但是我注意到一些“神奇”的东西,并且我对引擎盖下正在发生的事情的性能感到担忧。 假设我使用TPC设计创建实体,所有实体都(直接或间接地)从根基础实体继承,并且根基础实体包含全局唯一标识符(例如Guid),该标识符是在保存之前在代码中生成的(即,不是由数据库生成)。

我希望以下代码能够通过查询与相应的通用类型相关的表来返回类型化的动态代理来工作(并且确实如此):

context.Set<ConcreteDerivedEntityClass>().Find(someGuid)

但是,我也注意到我可以执行以下操作:

context.Set<BaseEntityClass>().Find(someGuid)

这非常酷,并且会神奇地为正确的具体类的请求的ID返回类型化的动态代理。 EF到底如何知道ID属于哪个派生类/表? 它会查找它知道的每个表/实体类型,直到找到匹配项(因此会影响性能)?

继承表/实体的主键也是指向基表的外键。

然后要做的就是查看从基类继承的类。 它也可能在加载时将该关系缓存在内存中的某个位置,以避免每次调用反射时的性能下降,因为该关系是运行时静态的。

剩下的就是查询与子类名称匹配的表。 由于需要继承,因此这将是聚簇索引seek 因此,尽管有性能损失,但考虑到您获得的抽象却微不足道。

编辑:

默认情况下,代码首先求助于每个层次表(TPH),这是1个非规范化表,其实体类型编码在Descriminator列中。 在这种情况下,该列告诉EF将结果键入到哪个实体中。

上面提到的TPC在DBContext中需要附加代码来指定正确的表映射。 它可能会将其缓存在内存中,并运行上面已经描述的例程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM