1

Typeテーブルへの外部キーであるTypeId列を持つBaseTableがあります。階層パターンごとのテンプレートを使用して、これをエンティティ フレームワーク モデルにマッピングしました。

これで、 andと make BaseClassBaseClassという名前の 1 つと 2 つのサブクラスができました。SubClass1SubClass2abstract

私のページの1つから2番目のページまで、ID(BaseClassもちろんIDです)を取得し、データベースからこのオブジェクトを取得したいと考えています。

クエリを作成するにはどうすればよいですか? もちろん、今後のIDはサブクラスによって所有されます。

たとえば、次のように記述できますか。

BaseClass object = provider.getfrombaseclassbyid(id);

このようなボクシングをすることはできますか?可能であれば、オブジェクトが実際に何であるかをどのように知ることができますか。Subclass1またはSubclass2?_ どうすればそれを知ることができますか?

どうすればいいですか?

4

1 に答える 1

0

以下があなたの質問に答えているかどうかはわかりませんが、抽象的なエンティティを表すセットに対してクエリを実行できます。

BaseClass entity = context.BaseClasses.SingleOrDefault(b => b.Id == id);

もちろん、BaseClass抽象型のインスタンスを作成できないため、結果が型になることはありません。それはタイプSubClass1またはSubClass2(またはnullそのエンティティがid存在しない場合)のいずれかになります。Entity Framework は、識別子列の値 (Table-Per-Hierarchy (TPH) 継承の場合) を調べるか、ベース テーブルから派生テーブルに結合することによって、オブジェクトの作成時に使用する必要がある型を決定できます。タイプ (Table-Per-Type (TPT) 継承用)。

たとえば、次を使用して具体化されたタイプを確認できます。

string typeName = entity.GetType().Name; // will be "Subclass1" or "Subclass2"

または:

if (entity is SubClass1)
    // ...
else if (entity is SubClass2)
    // ...

タイプのエンティティをロードすることが事前にわかっている場合は、次の演算子SubClass1を使用できます。OfType<T>

SubClass1 entity = context.BaseClasses.OfType<SubClass1>()
    .SingleOrDefault(b => b.Id == id);

指定されたエンティティが aではなくidaである場合、このクエリの結果は になります。それ以外の場合は、 であることが保証されます。SubClass1SubClass2nullSubClass1

于 2012-07-21T14:03:56.717 に答える