2017-08-19 9 views
1

でXMLに私はこのようなクラスがあります。地図Entity Frameworkのプロパティデータベース

public class GeneralClass 
{ 
    public int Id {get; set;} 
    public string Name {get; set;} 
} 

かなり一般的なクラスです。私はまた、このような派生クラスを持っている:

public class DerivedClass: GeneralClass 
{ 
    public int SpecificProperty {get; set;} 
    public string AnotherSpecificProperty {get; set;} 
    public bool BooleanSpecificProperty {get;set;} 
} 

問題は、私は、データベース内の継承はオプションではありませんなぜthat's、私のアプリで派生クラス(10以上)の多くを持つことができる、です。 私が思いついた解決策は、GeneralClassをテーブルとして使用し、特定のプロパティを含むXML列を使用することです。このような

何か:特定のプロパティは、派生クラスのプロパティを含む

CREATE TABLE 
General(Id int primary key, 
     Name nvarchar(50), 
     SpecificProperties xml); 

質問は次のとおりです。Entity Frameworkを使用してこのxml列を保存およびクエリする方法、およびxmlをプロパティに逆シリアル化する方法はありますか。 ありがとうございました!

+0

私が知る限り、XMLクエリはEFでサポートされていません。ですから、選択後に述語を適用しなければならないと思います。 –

答えて

2

「... 私は、データベース内の継承がOPTIONされていない理由that's、私のアプリで派生クラス(10以上)の多くを持つことができる」 - なぜありませんの!?階層あたりテーブル(TPH)とタイプ(TPT)当たりテーブル -

二つの主な遺伝パターンがあります。最初のものはSQLリソースの無駄に見えるかもしれませんが、2番目のものはおそらくあなたの要件に合っています。コンクリートタイプ(TPC)の1つのパターン、のテーブルがあります。これはTPTのバリエーションと考えられます。階層に抽象クラスがないか、少なくとも投稿したコードスニペットには含まれていないので、 TPTを使用して、あなたがよく知っている方法、たとえばエンティティに対するLINQをクエリするのは当然です。 EFおよび継承パターンの詳細は、hereおよびhereを参照してください。

XMLを使用することを強くお勧めする場合は、フィールドをXMLタイプとして宣言することができます(これはSQL Serverがサポートする列データ型です)。 here,here、およびhereのようにクエリできます。