Entity Framework 5 の Code First からこの関係を作成する方法を見つけようとしています。
以下の例では、 WarehouseまたはRowに属するStockがあります。
ストックテーブル
'Id', 'SerialNo', 'Discriminator', 'LocationId'
345, ABC123, Warehouse, 4
123, ABC124, Row, 12
倉庫テーブル
'Id', 'Name'
4, WH-One
8, WH-Two
行テーブル
'Id', 'Name'
6, RowA
12, RowB
StockテーブルのDiscriminator列は、 LocationIdが参照している関連テーブルを決定します。例: IDが '345' の在庫には、倉庫テーブルの ID が 4 (WH-One) の行への参照があります。
このタイプのリレーションシップを EF Code First でマップできますか? SQL Server でこの構造に対してクエリを実行することは、まったく問題ありません。
SELECT Stock.SerialNo, COALESCE(Warehouse.Name, Row.Name) AS Name
FROM Stock
LEFT OUTER JOIN Warehouse ON Stock.Id = Warehouse.Id AND Stock.Discriminator = 'Warehouse'
LEFT OUTER JOIN Row ON Stock.Id = Row.Id AND Stock.Discriminator = 'Row'
どちらが返されますか:
SerialNo, Name
ABC123, WH-One
ABC124, RowB
理想的には、WarehouseとRowが派生するインターフェイスまたは抽象基本クラスのいずれかが必要です。そして、abstract/interface にキャストされたいずれかのテーブルを参照するLocationと呼ばれるナビゲーション プロパティ。
または、あるエンティティが他のいくつかの同様のエンティティのいずれかを参照できるようにする EF Code First の関係を記述するためのより良い提案があるかどうかを知りたいです。