OData:使用 ODataConventionModelBuilder 映射继承的键

本文关键字:继承 映射 ODataConventionModelBuilder 使用 OData | 更新日期: 2023-09-27 18:36:35

具有这些:

class Base
{
  public int ID {get;set;}
}
class DerivedA : Base
{
}
class DerivedB : Base
{
}
...

然后我可以像这样设置公共主键:

builder.EntityType<Base>().HasKey(m => m.ID);

但是,当我这样做时,每个派生类型都会被映射,这是不希望的,原因有很多,其中一个是我有几十个派生类型。带着耐心,我试图忽略每一个我不想要的,我最终得到了这个错误:

The sequence contains more than one element
   at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
   at System.Web.OData.Builder.ODataConventionModelBuilder.RemoveBaseTypeProperties(StructuralTypeConfiguration derivedStructrualType, StructuralTypeConfiguration baseStructuralType)
   at System.Web.OData.Builder.ODataConventionModelBuilder.DiscoverInheritanceRelationships()
   at System.Web.OData.Builder.ODataConventionModelBuilder.GetEdmModel()

我确实相信忽略最终会以某种方式相互重叠。我只是无法为每个忽略块微调。到目前为止唯一有效的方法是将 ID 属性重新定义为每个派生类的新属性,这几乎违背了基类的整个目的。

有什么提示吗?

OData:使用 ODataConventionModelBuilder 映射继承的键

有很多事情需要考虑,我从许多试验和错误中没有看到的一个遗留问题是,除了基类的 ID 映射之外,我还为派生类映射了相同的 ID:

builder.EntityType<Base>().HasKey(m => m.ID);
...
(in another class far far away)
builder.EntityType<DerivedA>().HasKey(m => m.ID);
builder.EntityType<DerivedB>().HasKey(m => m.ID);
我删除了派生类上的键映射,

只保留了基类上的键映射,一切正常。所以我想这与忽略无关。

多么神秘的通用错误消息...

我用这个新信息更新了一篇博客文章,请查看它以获取更多信息,包括如何忽略派生类型。