我的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我希望某人已经投入了时间来理解这一点,我可以避免另一天在框架源中遇到断点。
感谢您的帮助, 伊恩