我正在使用Model-First模式中的Entity Frameworks 4.0(CTP5)构建ORM.我的一些实体具有复杂(对象树)属性,不需要是ORM实体 – 它们只对使用此数据库的后端服务器系统感兴趣,而不是对使用此数据库的客户端感兴趣.
我可以将属性的对象树序列化为字符串并将其作为字符串存储在DB中,但sql Server XML数据类型确实很吸引人.能够以智能方式查询XML数据内容将是非常好的.
但是,我没有看到任何方法在Visual Studio实体建模器中指定我想要XML数据类型.
是完成此操作以在模型中指定字符串字段,发出DDL,然后修改DDL以将字符串字段更改为XML字段的唯一方法吗?这似乎非常脆弱,只写一次,永远不会改变.有没有更好的办法?
解决方法
在“Entity Framework 4.0 Recipes”中,Larry Tenny和Zeeshan Hirani表示,EF 4.0根本不支持XML数据类型.
它们提供了一种解决方法,即使模型生成的实体类上的字符串类型属性为private,并创建一个新属性(在您自己的实体类的部分类中)以从内部字符串属性返回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类型的shadow属性应该可行,但是在原始字符串属性(Resume)和新shadow属性(CandidateResume)的每次更改之间字符串和XML之间的转换都非常昂贵.
如果有人有任何更好的想法,我仍然愿意接受建议.