我想使用EF核心HasData方法为数据库添加引用数据。我想要种子的两个模型遵循表每个层次结构(TPH)模式,即存在一个非抽象基类型和另一个非抽象派生类型。数据库中的这些模型存在于以基类型命名的具有判别器列的表中。我想为这个表添加数据种子。然而,在EF核心6文档中,我很难找到关于如何这样做的指导方针。
我有几个相关的问题:
我是使用HasData方法在EntityTypeBuilder<BaseType>上创建所有数据,还是需要在该类上将种子拆分为一个HasData,而在EntityTypeBuilder<DerivedType>上将另一个HasData拆分
我理解使用TPH将添加一个阴影鉴别器属性,这可能需要在数据种子中添加该属性。这是否意味着我必须使用匿名类型来指定属性(看起来不太优雅),如果是的话,我是否可以使用方法获得自动生成的鉴别器名称(手动输入它听起来像是风险,如果EF Core更改了鉴别器名称约定怎么办?)
我应该完全避免在参考表上使用TPH吗?我还有别的事要做吗?
发布于 2022-04-10 16:00:42
在反复尝试了我的选项之后,我得出了以下解决方案。它可能不是完美的,但它解决了我所有的关切。
我是使用
HasData方法在EntityTypeBuilder<BaseType>上创建所有数据,还是需要在该类上将种子分为一个HasData,另一个在EntityTypeBuilder<DerivedType>上?
您必须在两个类上都这样做,否则会在创建迁移时抛出:The seed entity for entity type 'BaseType' cannot be added because the value provided is of a derived type 'DerivedType'. Add the derived seed entities to the corresponding entity type.。
我理解使用TPH将添加一个阴影鉴别器属性,这可能需要在数据种子中添加该属性。这是否意味着我必须使用匿名类型来指定属性(看起来不太优雅),如果是的话,我是否可以使用方法获得自动生成的鉴别器名称(手动输入它听起来像是风险,如果EF Core更改了鉴别器名称约定怎么办?)
我已经向BaseType类添加了一个属性,并将其定义为判别器,因此现在我可以直接指定鉴别器值,而无需使用匿名类型,并且可以控制判别器值。格特·阿诺德( Gert )指出,在另一个答案中为什么这样做可能不合适。但是,我使用了下面描述的在这份EF核心杂志上方法来缓解他提出的担忧。
我应该完全避免在参考表上使用TPH吗?我还有别的事要做吗?
这件事仍未得到答复。但我现在更有信心,这是一个很好的方法。
https://stackoverflow.com/questions/71817091
复制相似问题