我正在使用模型优先模式中的Entity Frameworks 4.0(CTP5)构建ORM。我的一些实体具有复杂(对象树)属性,不需要是ORM实体 - 它们只对使用此数据库的后端服务器系统感兴趣,而不是对使用此数据库的客户端感兴趣。
我可以将属性的对象树序列化为字符串并将其作为字符串存储在DB中,但SQL Server XML数据类型确实很吸引人。能够以智能方式查询XML数据内容将是非常好的。
但是,我没有看到任何方法在Visual Studio实体建模器中指定我想要XML数据类型。
唯一的方法是完成此操作以在模型中指定字符串字段,发出DDL,然后修改DDL以将字符串字段更改为XML字段?这似乎非常脆弱,只写一次,永远不会改变。还有更好的方法吗?
答案 0 :(得分:9)
在“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类型的shadow属性应该可以,但是在原始字符串属性(Resume)和新的shadow属性(CandidateResume)的每次更改之间字符串和XML之间的转换都非常昂贵。
如果有人有更好的想法,我仍然愿意接受建议。
答案 1 :(得分:0)
我找到了一种方法来掩盖Entity Framework通过使用隐藏的复杂类型将XML属性映射到String-property的事实。虽然这要求您在将每个受影响的实体保存到数据库之前对其进行修改。粗略地说,我利用了Entity Framework允许您在.csdl文件中指定内部类型的事实。
我在这里详细描述了我的方法:.net ORM Comparison
我还安装了CTP5以查看代码优先方法,看看是否可以在没有.edmx或.csdl文件的情况下使用相同的方法。如果我找到另一种方法,我会编辑这个答案。