OData异常复杂类型'WebTools.Order'通过属性'Customer'引用实体类型'WebTools.Customer'

Pat*_*lvé 4 entity-framework odata asp.net-web-api

我开始使用OData和Entity Framework.

我创建了一个暴露客户的控制器.在模型(edmx)中,只有一个实体(Customer),一切正常(数据正在呈现).

现在,当我添加第二个实体(订单)(从数据库更新模型,选择订单)时,会自动设置1到多个(1个客户到多个订单).

我什么都不做,当我编译/运行控制器时,我收到此错误:

Line 23:         builder.EntitySet(Of Customer)("Customers")
Line 24:         Return builder.GetEdmModel()  --> Exception Here
Line 25: 
Line 26:     End Function
Run Code Online (Sandbox Code Playgroud)

复杂类型"WebTools.Order"通过属性"Customer"引用实体类型"WebTools.Customer".

如果我删除订单实体,它可以工作.

我不确定问题是否与方程式的OData/WebAPI部分或"实体框架"的"配置"有关.

Rag*_*nti 15

我假设模型构建器无法确定实体类型Order的键属性.您可以通过几种方式帮助模型构建器,

  1. builder.EntitySet<Order>("orders");.这会添加新的实体集"订单",并且还具有将"订单"类型标记为实体类型的效果.您还必须指定"订单"的关键属性.

  2. 使用属性标记"订单"类型的关键属性(或属性)[Key].

  3. 如果你讨厌属性并喜欢在代码中执行它,你可以这样做, builder.EntitySet<Order>("orders").EntityType.HasKey(o => order.KeyProperty);

  • 不幸的是,此时EF使用的EDM模型与Web API OData使用的EDM模型不同.人们通常不喜欢直接公开他们的数据库模型,而是使用DTO将它们分开.我们正在努力改善模型构建的体验,以便您只想通过服务公开数据库模型.在此之前,您必须自己构建模型.此外,是否可以共享您的客户和订单类?只是想知道为什么ODataModelBuilder无法正确推断它. (2认同)