XML数据类型

Dou*_*ugS 11 ef-code-first entity-framework-4.1

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

我们存储了很多动态数据,有些人会在每行/每个记录中导致元数据,它不是标准的,因此我们依赖于xml数据结构,然后使用计算列创建我们可用于更快SQL搜索的密钥.

坦率地说 - 一个expando对象映射到xml列真的会浮动我们的船.

提前致谢.

Mat*_*int 13

最初的问题是:

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

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

[Column(TypeName="xml")]
public string Foo {get; set;}
Run Code Online (Sandbox Code Playgroud)

或者通过流利的api:

modelBuilder.Entity<MyEntity>()
            .Property(x => x.Foo)
            .HasColumnType("xml");
Run Code Online (Sandbox Code Playgroud)

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


mar*_*c_s 1

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

至于计算列:

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

    ALTER TABLE dbo.YourTable
      ADD PriceWithTax AS PriceWithoutTax * (1 + TaxRate)
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    ALTER TABLE dbo.YourTable
      ADD PriceWithTax as dbo.AddTaxToPrice(PriceWithoutTax, TaxRate)
    
    Run Code Online (Sandbox Code Playgroud)

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

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