ASP.Net WebAPI OData - 实体上的复合键

时间:2013-04-02 00:59:26

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

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

弥补(但相当接近)的例子......三个实体

Patients
  PatientID           (PK)
  PatientName, etc

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

IdentifierTypes
  IdentifierTypeID    (PK)
  Description

Identifiers表有一个复合键。基本上是Patient和IdentifierTypes之间的多对多,但是在连接表上有数据。它应该没关系,但如果是这样,ID就是GUID(SQL Server中的uniqueidentifier)。

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

我可以看到几个避免修改表的解决方案,虽然我不确定WebAPI中是否所有都可以实现

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

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

这有一个问题,即从Entity Framework中搜索IdentifierID会很慢。我想用一个索引视图来解决这个问题。

b)中 与(a)相同,但是在我的控制器的[可查询] Get()方法中,我改为使用ODataQueryOptions和一些表达式解析魔法(根本不熟悉它)来查看我们是否过滤了IdentifierID,如果是,则拆分在PatientID和IdentifierTypeID上的过滤器

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

d) (c)的一些混合不是那么聪明但仍能达到相同的结果

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

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

感谢您的帮助, 伊恩

1 个答案:

答案 0 :(得分:4)

可以使用Web API OData执行复合键。你甚至不需要使用每晚构建来做到这一点。 RTM位应该是好的。有关详细信息,请参阅鸿业的这篇伟大sample