1

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

理想的には、WarehouseRowが派生するインターフェイスまたは抽象基本クラスのいずれかが必要です。そして、abstract/interface にキャストされたいずれかのテーブルを参照するLocationと呼ばれるナビゲーション プロパティ。

または、あるエンティティが他のいくつかの同様のエンティティのいずれかを参照できるようにする EF Code First の関係を記述するためのより良い提案があるかどうかを知りたいです。

4

1 に答える 1