【问题标题】:How to specify SQL Server XML data type in Entity Frameworks 4.0 Model?如何在 Entity Frameworks 4.0 模型中指定 SQL Server XML 数据类型?
【发布时间】:2011-02-28 23:57:37
【问题描述】:

我正在以模型优先模式使用实体框架 4.0 (CTP5) 构建 ORM。我的一些实体具有不需要是 ORM 实体的复杂(对象树)属性——它们只对使用此数据库的后端服务器系统感兴趣,而不是对使用此数据库的客户端感兴趣。

我可以将属性的对象树序列化为字符串并将其作为字符串存储在数据库中,但是 SQL Server XML 数据类型确实很吸引人。能够以智能的方式查询 XML 数据内容将是非常好的。

但是,我没有看到任何方法可以在 Visual Studio Entity Modeler 中指定我想要 XML 数据类型。

完成此操作的唯一方法是在模型中指定字符串字段,发出 DDL,然后修改 DDL 以将字符串字段更改为 XML 字段吗?这似乎非常脆弱并且只写一次,永远不会改变。有没有更好的办法?

【问题讨论】:

  • 顺便说一句,它不再是“SQL XML”。它只是 SQL Server 的内置部分。
  • 短期内对您没有帮助,但您可以对此投票:data.uservoice.com/forums/…

标签: .net xml entity-framework entity-framework-4


【解决方案1】:

在“Entity Framework 4.0 Recipes”中,Larry Tenny 和 Zeeshan Hirani 指出,EF 4.0 根本不支持 XML 数据类型。

他们确实提供了一种解决方法,即将模型生成的实体类上的字符串类型属性设为私有,并创建一个新属性(在您自己的实体类的部分类中)以从内部字符串返回 XElement属性:

public partial class Candidate
{
    private XElement candidateResume = null;

    public XElement CandidateResume
    {
        get 
        {
            if (candidateResume == null)
            {
                candidateResume = XElement.Parse(this.Resume);
                candidateResume.Changed += (s,e) =>
                {
                    this.Resume = candidateResume.ToString();
                }
            }

            return candidateResume;
        }

        set
        {
            candidateResume = value;
            candidateResume.Changed += (s,e) =>
            {
                this.Resume = candidateResume.ToString();
            }
            this.Resume = value.ToString();
        }
    }
}

像这样创建所需 XML 类型的影子属性应该可以工作,但是每次更改原始字符串属性 (Resume) 和新的影子属性 (CandidateResume) 时,字符串和 XML 之间的转换非常昂贵。

如果有人有更好的想法,我仍然愿意接受建议。

【讨论】:

    【解决方案2】:

    我找到了一种方法来掩盖实体框架将 XML 属性映射到字符串属性这一事实,方法是使用隐藏的复杂类型。尽管这要求您在将每个受影响的实体保存到数据库之前对其进行修改。我大致利用了 Entity Framework 允许您在 .csdl 文件中指定内部类型这一事实。

    我在这里详细描述了我的方法:.net ORM Comparison

    我还刚刚安装了 CTP5 来查看代码优先方法,看看是否可以在没有 .edmx 或 .csdl 文件的情况下使用相同的方法。如果我找到了另一种方法,我会编辑这个答案。

    【讨论】:

    • 我的第一次尝试没有运气。很简单,因为我不知道如何直接使用复杂类型。如果你能告诉我到目前为止你得到了什么或者你正在采用哪种代码优先方法(我对 DbContext、DbSet 等感到困惑),我可能只是“挂钩”它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多