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查询.
您在 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 中抓取位并将其公开在“父”表上的标量函数非常有效。