0

複数のモデル間で共有する一連のフィールドがあります。すべてのフィールドを各エンティティのテーブルに含める必要があります (フィールドの 1 つのテーブルだけではありません)。私はPythonなどの言語に精通しており、このタイプのパターンは「ミックスイン」と呼ばれ、本質的にそれ自体では存在しないクラスです(インスタンス化されない/テーブルにテーブルがありません)モデルクラスの場合)。代わりに、派生クラスは単にフィールドを継承し、そのテーブルはフィールドがモデル クラスに含まれているかのように見えます。

Entity Framework の「複合型」の概念は、私が探しているものに近いプロキシのように思えますが、ナビゲーション プロパティを含めることができないことは少しキラーです。これを行う他の方法はありますか、または複合型が答えである場合、ナビゲーション プロパティについてどうすればよいですか?

4

3 に答える 3

1

私は本でこのメモを読みました:

基本クラスとインターフェイス以外の興味深い可能性として mixin がありますが、これらは .NET 言語ではサポートされていない OOP 機能です。mixin は、他のクラスが継承できる特定の機能を提供するクラスですが、スタンドアロン クラスを意図したものではありません。別の言い方をすれば、ミックスインは、一部のメンバーに事前定義された実装が含まれるインターフェースのようなものです。ミックスインは、Python や Ruby などの一部の動的言語でサポートされています。現在、ミックスインをサポートする .NET 言語はありませんが、Castle などのアドホック フレームワークを使用してミックスインをシミュレートできます。動的プロキシ。このフレームワークでは、最初に、既存のクラスに挿入するすべてのメソッドを含むクラス (ミックスイン) を定義します。次に、フレームワークを使用して、注入されたメソッドを含む特定のクラスのプロキシを作成します。Castle.DynamicProxy はリフレクションを使用します。

于 2012-10-17T06:27:14.817 に答える
1

これは、継承を使用して行うことができます。すでにご検討済みでしたら、申し訳ありません。コードは次のとおりです。

public abstract class WidgetBase 
{
    public string Name { get; set; }
}

public class SweetWidget : WidgetBase 
{
    public int SweetnessFactor { get; set; }
}

public class SourWidget : WidgetBase
{
    public int Sourness { get; set; }
}

次に、モデル構成で次のことを行います。

const string discriminator = "WidgetType";
Map<SweetWidget>(mc => mc.Requires(discriminator).HasValue("Sweet"));
Map<SourWidget>(mc => mc.Requires(discriminator).HasValue("Sour"));

テーブルに列「WidgetType」を追加する必要があります。EF は、マッピングで指定されたとおりにデータを設定します。

基本クラスは抽象でなければならないことに注意してください。テーブルにすべての派生クラスのすべてのフィールドが含まれている限り、EF Code First で階層ごとにテーブルを作成する方法は次のとおりです。

于 2012-10-17T20:44:57.997 に答える
0

実際に、Entity Framework の開発者の 1 人とこれについて話し合う機会がありました。現時点では技術的に不可能です。どうやらそれは蹴られているようですが、現時点では誰もそれに取り組んでいません。複合型は一種のバージョンですが、もちろんナビゲーション プロパティをサポートしていません。私のためにそれを刺してくれてくれたみんなに感謝します。

于 2012-11-12T15:27:12.663 に答える