【问题标题】:OData exception The complex type 'WebTools.Order' refers to the entity type 'WebTools.Customer' through the property 'Customer'OData 异常 复杂类型 'WebTools.Order' 通过属性 'Customer' 引用实体类型 'WebTools.Customer'
【发布时间】:2013-03-04 12:13:22
【问题描述】:

我开始使用 OData 和实体框架。

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

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

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

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

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

如果我删除订单实体,它会起作用。

我不确定问题出在方程式的 OData/WebAPI 部分的“配置”还是“实体框架”。

【问题讨论】:

    标签: entity-framework asp.net-web-api odata


    【解决方案1】:

    我假设模型构建器无法找出实体类型 Order 的关键属性。您可以通过多种方式帮助模型构建者,

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

    2. 使用[Key] 属性标记“订单”类型上的关键属性。

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

    【讨论】:

    • 如果我有客户实体和另一个与客户无关的实体(城市或其他),它会起作用...只要我包含任何“与客户相关的”实体(来自从数据库更新模型),它失败了。我对 EF 的理解是,使用“从数据库更新模型”更新模型将负责处理实体之间的导航/关系(对吗?)。
    • 很遗憾,此时EF使用的EDM模型与Web API OData使用的EDM模型不同。人们通常不喜欢直接公开他们的数据库模型,而是使用 DTO 将它们分开。对于您只想通过服务公开数据库模型的场景,我们正在努力改善模型构建的体验。在此之前,您必须自己构建模型。另外,是否可以共享您的 Customer 和 Order 类?只是想看看为什么 ODataModelBuilder 无法正确推断。
    • 太好了,谢谢。我完全同意您关于直接公开数据库模型的评论,我只是向我的团队展示 OData。谢谢
    • RaghuRam,我正在使用 OData V1 (!) 将我的服务器从 WCF DataServices 更新到 WebApi2.1,我遇到了这个确切的问题。我的问题是我的数据库与 50 个“实时”数据表和另外 100 个“参考”表和更改跟踪数据高度相关。几乎每个表都是链接的。在这个阶段,我使用不同的 EDM 对数据进行了分区。在我的情况下,我很想公开数据库;)。很想就此聊聊,但由于某种未知原因,目前无法在 SO 中进行 PMing...
    • 这是一个令人沮丧的错误,我很高兴这篇文章在结果中排​​名第一!我现在一直在使用 OData 的许多版本,您忘记了这可能会发生。当有人重新生成数据库优先实体模型并且没有使用后缀“id”命名他们的主键字段时,我们的办公室发生了 - 所以表被发布为复杂类型 - 因为约定无法识别哪一列是键.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多