【问题标题】:Map Entity Framework properties to XML in database将实体框架属性映射到数据库中的 XML
【发布时间】:2017-08-19 20:11:41
【问题描述】:

我有这样的课:

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 反序列化到属性中?

【问题讨论】:

  • 据我所知,EF 不支持 XML 查询。所以我猜你必须在选择之后应用一个谓词。

标签: c# xml asp.net-mvc entity-framework


【解决方案1】:

“...我的应用程序中可以有很多派生类(超过 10 个),这就是为什么在数据库中继承不是一个选项” - 为什么不呢! ?

有两种主要的继承模式 - table per hierarchy (TPH) 和 table per type (TPT)。虽然第一个可能看起来相当浪费 SQL 资源,但第二个可能会符合您的要求。还有一个模式 - table per concrete type (TPC),它可以被认为是 TPT 的一种变体。您的层次结构中没有抽象类,或者至少您发布的代码 sn-p 没有,因此使用它很自然 TPT 和查询你非常熟悉的方式,比如 LINQ 到实体。有关 EF 和继承模式 herehere 的更多信息。

不过,如果您坚持使用 XML,您可以将字段声明为 XML 类型(这是一种列数据类型,SQL Server 支持)。你可以像hereherehere描述的那样查询它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-11
    • 2015-07-09
    • 1970-01-01
    • 2010-10-14
    • 2015-01-22
    • 2017-09-20
    • 2016-04-08
    • 1970-01-01
    相关资源
    最近更新 更多