【问题标题】:ASP.Net WebAPI OData - Composite keys on entitiesASP.Net WebAPI OData - 实体上的复合键
【发布时间】:2013-03-23 04:11:49
【问题描述】:

我的 EF 数据模型中有一些实体,其中实体的键是两列的组合。

虚构(但相当接近)示例...三个实体

Patients
  PatientID           (PK)
  PatientName, etc

Identifiers
  PatientID           (PK)
  IdentifierTypeID    (PK)
  Code
  StartDate, etc

IdentifierTypes
  IdentifierTypeID    (PK)
  Description

标识符表有一个复合键。基本上是患者和 IdentifierTypes 之间的多对多,但数据在连接表上。应该没关系,但如果有,ID 就是 GUID(SQL Server 中的唯一标识符)。

我可以稍微弯曲我的数据库,在标识符中创建一个新列,例如“IdentifierID”,它可能是主键,但我们有一个遗留代码库,如果可以避免的话,我宁愿不修改它。

我可以看到几种避免修改表的解决方案,尽管我不确定在 WebAPI 中是否真的可行

一) 在数据库中创建一个视图并将其作为我的实体的基础。视图的形式是

select 
  *,
  IdentifierID = cast( PatientID as varchar(50) ) + '_' + cast( IdentifierTypeID as varchar(50) )
from Identifiers

这有一个问题是从实体框架中寻找 IdentifierID 会很慢。我想我可以用一个索引视图来纠正这个问题。

b) 与 (a) 相同,但在我的控制器的 [Queryable] Get() 方法中,我改为使用 ODataQueryOptions 和一些表达式解析魔法(根本没有经验)来查看我们是否在 IdentifierID 上进行过滤,如果是,则拆分进入 PatientID 和 IdentifierTypeID 的过滤器

c) 我保持原样,并在 WebAPI OData 堆栈中发现了一些对 Tuple 作为实体键的未知支持。那将是真棒 :) 我继承自 EntitySetController,所以看起来我继承自 EntitySetController>

d) (c) 的一些混合,虽然不太聪明,但仍能达到相同的结果

OData 规范中似乎有复合键,因为 StackOverflow 上的另一个问题说明了如何在 OData 中处理这样的实体(使用 WCF 数据服务)。 How to address entity that uses composite identity key in OData Url?

我不介意使用夜间构建,甚至使用 ASP.Net 源代码 - 我已经在周末单步执行 OData 请求以解决另一个问题(我的错)在查询字符串中格式化 GUID:P 我希望有人已经投入时间理解这一点,我可以避免另一天在框架源代码中遇到断点。

感谢您的帮助, 伊恩

【问题讨论】:

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


    【解决方案1】:

    可以使用 Web API OData 执行复合键。你甚至不需要使用每晚构建来做到这一点。 RTM 位应该是好的。详情请参考宏业的sample

    【讨论】:

    • 太棒了!我现在正在检查它。我以为我已经阅读了几乎所有可用的博客文章 - 显然不是这样。
    • 这是一种享受。根据示例,我有一些来自 EntitySetController 的控制器和其他来自 ApiController 的控制器。我从 CodePlex 签出了 OData 示例,但没有意识到新的示例已经到达那里 - 感谢您指出。
    猜你喜欢
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 2012-07-03
    • 2016-02-12
    • 2013-09-02
    • 2016-04-23
    • 2015-03-12
    • 2014-09-07
    相关资源
    最近更新 更多