に私は次のコードの構造を有する:もちろんは、Entity Frameworkの生成されたテーブルにリンクテーブルを追加し、識別カラム
class Car
class Honda : Car
class Toyota : Car
これはCars
テーブル内Discriminator
列を生成します。
車テーブル::だから、私たちはのようなレコードを持っていると思います
Id Discriminator Color
---------------------------
1 Honda Yellow
2 Honda Red
3 Toyota Yellow
は今、私は何をしたいのメイク/モデルごとPrice
を追加することにより、Car
情報を拡張しています。しかし、それはマッピングテーブルでなければなりません。なぜなら、それは車ごとのものであり、車のインスタンス(記録)によるものではないからです。
のような何か:
CarPricesテーブル:
CarType Amount
------------------
Toyota 10000
Honda 11000
基本的に私はHonda
のために、私に11,000
値になるだろうcar.Price.Amount
プロパティを、したいです。
public class CarPrice
{
public CarPrice(Car car, int amount)
{
var carType = car.GetType();
if (carType.BaseType != null && carType.Namespace == "System.Data.Entity.DynamicProxies")
{
// Get rid of the EF dynamic proxy wrapper
carType = carType.BaseType;
}
this.CarType = carType.Name;
this.Amount = amount;
}
protected CarPrice()
{
// Required by EF
}
[Required]
public int Amount { get; private set; }
[Key]
public string CarType { get; private set; }
}
が、私はCarPrice
にマッピングするために、そのDiscriminator
に基づいてCar
にPrice
プロパティを、どうなるかわからない:
は、私は、以下の「マッピング」を行うことができると思います。
class Car
{
// ...
// TODO: I only need 'get'
public virtual CarPrice Price { get; }
}
私はCars
テーブルに新しい列を追加することを避けるために持っているので、リンクはほとんど間違いなく既存のレコードのDiscriminator
欄に起こることがあります。
私はこれにどのようにアプローチしますか?たぶんFluent APIを使用してcar.Price
プロパティをカスタムSQLクエリにマップしたり、何とかCarPrices
テーブルにポイントすることができますか?
解決策がMapping Properties of an Entity Type to Multiple Tables in the Database (Entity Splitting)を中心に回転すると思います。
いいえ、私は車のレベルにCarTypeを導入することはできません。 Discriminatorの列には既にHonda、Toyotaなどのタイプがあります。 –
なぜ私は理解できません。モデルと制約を明確にすることはできますか? –
いくつかの理由:1)テーブルに新しい列を追加することで、「アップグレード」したくない100万レコードがあります。 2)「Discriminator」列には必要な情報がすでに入っているので、必要はありません。 3)それぞれの「カスタム」識別器をエンティティにマップする必要がある「Requires」部分が嫌いです。それは必要ではありません。 –