Hel*_*rld 0 c# entity-framework-core
我正在使用DbContext.Model.GetEntityTypes()检查我的数据库方案中的类型。我怎么知道一个IEntityType不拥有(即有自己的 SQL 表)。在我的 DbContext 中,我将通过使用属性或使用 Fluent API 来指示拥有的属性。
我怎么知道一个
IEntityType不拥有(即有自己的 SQL 表)
这里其实有两个问题。
第一个是
我怎么知道一个
IEntityType不是拥有的
这很简单 - 您使用IsOwned扩展方法。所以给出IEntityType entityType:
bool isOwned = entityType.IsOwned();
Run Code Online (Sandbox Code Playgroud)
第二个是
我如何知道一个
IEntityType是否有自己的 SQL 表
这个比较复杂,因为实体类型是否被拥有并不足以说明这一点。
首先,表拆分(即在 2 个或更多实体之间共享表)仅支持一对一关系。但是,EF Core 还支持拥有类型的集合,它们是一对多关系并映射到单独的表。
您可以使用如下代码检测实体类型是否为引用拥有类型(即非集合拥有类型):
var ownership = entityType.FindOwnership();
bool isReferenceOwned = ownership != null && ownership.IsUnique;
Run Code Online (Sandbox Code Playgroud)
其次,即使默认情况下引用拥有的类型映射到与所有者相同的表,它们也可以配置为使用自己的表。这些可以排除如下(EF Core 3.x):
var ownership = entityType.FindOwnership();
bool isSharedOwned = ownership != null && ownership.IsUnique &&
ownership.PrincipalEntityType.GetTableName() == entityType.GetTableName();
Run Code Online (Sandbox Code Playgroud)
第三,即使默认常规类型映射到单独的表,它们也可以配置为使用表拆分。所以你需要考虑到这一点。
最后,还有数据库继承,由BaseType属性指示。目前 EF Core (3.x) 只支持 EF Core table-per-hierarchy (TPH) 模式,所以只有GetRootType可以拥有自己的表,但在未来(5.x?)EF Core 将支持 table-per-type (TPT),因此所有这些也必须考虑在内。
很快,通常很难确定哪种实体类型具有自己的表,或者更具体地说,如果这是背后的实际问题,您应该“按照自定义约定”配置哪个实体表名称。您需要检查所有上述条件并做出相应反应。但是,如果您不使用其中任何一个,!entityType.IsOwned()就足够了。