エンティティのキーが 2 つの列の複合体である EF データ モデルにいくつかのエンティティがあります。
でっちあげの (しかしかなり近い) 例... 3 つのエンティティ
Patients
PatientID (PK)
PatientName, etc
Identifiers
PatientID (PK)
IdentifierTypeID (PK)
Code
StartDate, etc
IdentifierTypes
IdentifierTypeID (PK)
Description
Identifiers テーブルには複合キーがあります。基本的に、Patients と IdentifierTypes の間は多対多ですが、結合テーブルにデータがあります。それは問題ではありませんが、問題がある場合、ID は GUID (SQL Server の一意の識別子) です。
データベースを少し曲げて、主キーになる可能性のある「IdentifierID」などの識別子に新しい列を作成できますが、回避できる場合は変更したくないレガシーコードベースがあります。
すべてが WebAPI で実際に可能かどうかはわかりませんが、テーブルの変更を回避するいくつかのソリューションを見ることができます
a) データベースにビューを作成し、これをエンティティの基礎として使用します。ビューは次の形式です
select
*,
IdentifierID = cast( PatientID as varchar(50) ) + '_' + cast( IdentifierTypeID as varchar(50) )
from Identifiers
これには、Entity Framework からの IdentifierID のシークが遅くなるという問題があります。私が推測するインデックス付きビューでこれをいくらか修正することができます。
b) (a) と同じですが、私のコントローラーの [Queryable] Get() メソッドでは、代わりに ODataQueryOptions といくつかの式解析マジック (まったく経験がありません) を使用して、IdentifierID でフィルタリングしているかどうかを確認します。 、PatientID と IdentifierTypeID のフィルターに分割します
c) 私は物事をそのままにして、WebAPI OData スタックのエンティティ キーとして Tuple の不明なサポートを発見しました。それは素晴らしいでしょう:)私はEntitySetController <>から継承しているので、EntitySetController>から継承しているように見えます
d) (c) のいくつかのブレンド。それほど賢くはありませんが、それでも同じ結果が得られます
StackOverflow に関するこの他の質問は、OData でそのようなエンティティに対処する方法 (WCF Data Services を使用) を示しているため、OData 仕様に複合キーを含めることは可能と思われます。OData Url で複合 ID キーを使用するエンティティに対処する方法は?
ナイトリー ビルドを使用したり、ASP.Net ソースを使用したりすることは気にしません。別の問題 (私の失敗) を解決するために、既に OData リクエストをステップ実行して週末を過ごしました。クエリ文字列で GUID をフォーマットする:Pこれを理解するのに何時間も費やしたので、フレームワークのソースでブレークポイントにぶつかる別の日を避けることができます。
助けてくれてありがとう、イアン