我有一个这样的课程:
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;}
}
问题是,我的应用程序中可以有很多派生类(超过10个),这就是为什么数据库中的继承不是一个选项。
我提出的解决方案是将GeneralClass
作为表,并使用包含特定属性的XML列。
这样的事情:
CREATE TABLE
General(Id int primary key,
Name nvarchar(50),
SpecificProperties xml);
其中特定属性包含派生类的属性。
问题是:如何使用Entity Framework保存和查询此xml列,并将xml反序列化为属性? 先谢谢!!
答案 0 :(得分:2)
“... 我的应用程序中可以有很多派生类(超过10个),这就是为什么数据库中的继承不是选项” - 为什么不呢!吗
有两种主要的继承模式 - 每个层次结构的表(TPH)和每种类型的表(TPT)。虽然第一个可能看起来相当浪费SQL资源,但第二个可能符合您的要求。还有一种模式 - 每个具体类型的表(TPC),可以认为是TPT的变体。您的层次结构中没有抽象类,或者至少您发布的代码片段没有,因此使用它是很自然的 LINQ对实体说,TPT和查询你非常熟悉的方式。有关EF和继承模式的更多信息here和here。
但是,如果你坚持使用XML,你可以将该字段声明为XML类型(这是一种列数据类型,SQL服务器支持)。您可以按照here,here和here所述进行查询。