Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework ASP.Net WebAPI OData-实体上的复合键_Entity Framework_Asp.net Web Api_Odata - Fatal编程技术网

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

Entity framework ASP.Net WebAPI OData-实体上的复合键,entity-framework,asp.net-web-api,odata,Entity Framework,Asp.net Web Api,Odata,我的EF数据模型中有一些实体,其中实体的键是两列的组合 虚构(但相当接近)的例子。。。三个实体 Patients PatientID (PK) PatientName, etc Identifiers PatientID (PK) IdentifierTypeID (PK) Code StartDate, etc IdentifierTypes IdentifierTypeID (PK) Descriptio

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

虚构(但相当接近)的例子。。。三个实体

Patients
  PatientID           (PK)
  PatientName, etc

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

IdentifierTypes
  IdentifierTypeID    (PK)
  Description
标识符表有一个复合键。基本上,患者和身份识别类型之间存在多对多关系,但数据在联接表中。这应该无关紧要,但如果确实如此,ID就是GUID(SQL Server中的uniqueidentifier)

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

我可以看到一些避免修改表的解决方案,尽管我不确定所有这些在WebAPI中是否都是可行的

(a) 在数据库中创建一个视图,并将其作为我的实体的基础。视图是表单的一部分

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堆栈中发现一些未知的对元组作为实体键的支持。那太棒了:) 我是从EntitySetController继承的,因此看起来像是从EntitySetController>

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

OData规范中似乎可能有复合键,因为StackOverflow上的另一个问题是如何在OData中处理这样的实体(使用WCF数据服务)

我不介意使用夜间构建,甚至使用ASP.Net源代码——我已经花了一个周末来处理OData请求,以解决另一个问题(我的错)在查询字符串中格式化guid:P我希望有人已经花了几个小时来理解这一点,我可以避免在框架源代码中再次遇到断点

谢谢你的帮助,
Ian

可以使用web API OData执行复合密钥。您甚至不需要使用夜间构建来实现这一点。RTM比特应该是好的。有关详细信息,请参阅Hongye的这篇文章。

可以使用web API OData执行组合键。您甚至不需要使用夜间构建来实现这一点。RTM比特应该是好的。有关详细信息,请参阅红叶的这篇巨著。

太棒了!我现在正在查。我想我已经读了几乎每一篇可用的博客文章——显然不是这样。这是一种享受。我有一些控制器是从EntitySetController派生的,还有一些只是从ApicController派生的,如示例所示。我在CodePlex上查看了OData示例,但没有意识到新的示例已经到了那里-感谢您指出。太棒了!我现在正在查。我想我已经读了几乎每一篇可用的博客文章——显然不是这样。这是一种享受。我有一些控制器是从EntitySetController派生的,还有一些只是从ApicController派生的,如示例所示。我从CodePlex中查看了OData示例,但没有意识到新的示例已经到达了那里-感谢您指出这一点。