0

エンティティのキ​​ーが 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これを理解するのに何時間も費やしたので、フレームワークのソースでブレークポイントにぶつかる別の日を避けることができます。

助けてくれてありがとう、イアン

4

1 に答える 1

4

Web API OData を使用して複合キーを作成することができます。そのためにナイトリー ビルドを使用する必要さえありません。RTM ビットは良好なはずです。詳細については、Hongye によるこの素晴らしいサンプルを参照してください。

于 2013-04-02T01:11:33.577 に答える