OData:使用ODataConventionModelBuilder映射继承密钥

时间:2015-01-07 22:51:54

标签: c# entity-framework odata asp.net-web-api2 odata-v4

有这些:

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属性重新定义为每个派生类的新属性,这几乎违背了基类的整个目的。

有关于此的任何提示吗?

1 个答案:

答案 0 :(得分:1)

我需要考虑很多,而且我从许多试验和错误中看不到一个遗留问题是除了Base类的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);

我删除了派生类上的键映射,只留下了Base类上的键映射,一切正常。所以我猜这与无知无关。

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

我使用这些新信息更新了a blog post,请查看以获取更多信息,包括如何忽略派生类型。

相关问题