【问题标题】:XML data typeXML 数据类型
【发布时间】:2011-04-06 16:10:21
【问题描述】:

如何设置 EF 以对对象使用 XML 的 SQL 数据类型?此外,如何创建 SQL 计算列。

我们存储了很多动态数据,有些人会在每行/记录中生成元数据,这不是标准的,因此我们依赖 xml 数据结构,然后使用计算列来创建我们可以用于更快 SQL 的键搜索。

坦率地说 - 映射到 xml 列的 expando 对象真的会让我们的船浮起来。

提前致谢。

【问题讨论】:

    标签: ef-code-first entity-framework-4.1


    【解决方案1】:

    原来的问题是:

    如何设置 EF 以对对象使用 XML 的 SQL 数据类型?

    在代码中,你可以这样做:

    [Column(TypeName="xml")]
    public string Foo {get; set;}
    

    或者通过fluent api:

    modelBuilder.Entity<MyEntity>()
                .Property(x => x.Foo)
                .HasColumnType("xml");
    

    您仍然需要将属性解释为字符串,并且您需要自己在 C# 中将其转换为 xml。但是这样会生成一个 xml 列,你仍然可以使用 sql 的 xml 函数对它执行直接的 sql 查询。

    【讨论】:

      【解决方案2】:

      您在 EF 中所能做的就是以字符串的形式访问/读取 XML 列 - 从那里开始,您就靠自己了。没有“内置”机制可以将该 XML 转换为序列化对象或类似的东西。

      关于计算列:

      • 您可以在 SQL 中定义一个简单的表达式

        ALTER TABLE dbo.YourTable
          ADD PriceWithTax AS PriceWithoutTax * (1 + TaxRate)
        

        这将为您提供一个基于您的列 PriceWithoutTax 的新列 PriceWithTax 和另一个名为 TaxRate 的列(0.15 为 15% 税)

      • 或者你可以创建一个返回单个值的存储函数,然后调用它

        ALTER TABLE dbo.YourTable
          ADD PriceWithTax as dbo.AddTaxToPrice(PriceWithoutTax, TaxRate)
        

        我们还使用存储标量函数的这种方法来解析存储在 XML 列中的 XML,并将某些位和片段提取到计算列中。

      如果 SQL Server 认为您的计算是“确定性的”,您还可以在列定义中添加 PERSISTED 关键字。在这种情况下,您的值只计算一次并实际持久化/存储在该表中,就像任何其他列一样。您现在甚至可以索引这些列!这适用于例如标量函数,从 XML 中获取位并将其公开在“父”表中。

      【讨论】:

      • 谢谢,这解释了 thigns 的 SQL 方面,但不是 EF 将创建具有 XML 数据类型的列的部分和/或它将如何创建 post 表创建对表的增强,例如计算列,而我在它的约束等。
      • @DougS:也许您需要进一步说明您正在尝试做什么,您使用哪种 EF 方法(db-first、model-first、code-first)使用等。
      • 问题仍然存在,首先是代码,如何处理 XML 的 SQL 列类型?似乎由于它似乎不支持它检测到重大的模型更改并重建数据库。
      • @DougS:到目前为止,您未能透露您正在使用 code-first
      【解决方案3】:

      虽然不是您正在寻找的答案,但 NHibernate 完全支持您正在处理的那种场景。两种方法:

      • 在域模型中使用 XDocumentXmlDocument 属性。它开箱即用,您可以将其映射到xml sql 类型、nvarchar(max) 等。
      • 使用自定义类型对 xml 列做任何你想做的事情(包括映射到动态对象、值类型、字典或任何你能想到的东西)

      此外,对于一般计算属性,您可以查看 formulareadonly

      如果您的项目足够早并且需要这种灵活性,您可以考虑切换。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-30
        • 2010-11-15
        相关资源
        最近更新 更多