【发布时间】: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