一些背景:我有一个数据库,我想使用
linq-to-sql来更新C#应用程序.此表中的其中一列具有
XML数据类型.
该表中的其他列(不是XML数据类型)更新完好,但是当我对XML字段进行更改时,该程序正确执行(看似),但该字段始终保留其原始值运行SubmitChanges().
我在互联网环顾四周,发现Microsoft Connect上的几个帖子,诊断出类似的问题,最终偶然发现解决方案here:
强制XML字段更新不会这样做:
XElement tmp = MyLinqObject.XmlField; MyLinqObject.XmlField = null; MyLinqObject.XmlField = tmp;
而不是强制LINQ更新XML列分配克隆的对象:
MyLinqObject.XmlField = new XElement (MyLinqObject.XmlField);
我可以确认这确实似乎有效,但我不确定为什么.我唯一的猜测是,XmlField属性在堆上有一些唯一的标识符,通过进行克隆,您已经为它分配了一个新的唯一标识符.当Linq然后生成查询时,甚至不会尝试查看该字段是否已被更新,因为它有一个新的id,它只是将该值写入数据库.但是,我只是猜测,希望别人可以更好地了解幕后的情况.
编辑:要解决Jon的帖子,问题的原因(正如在MS Connect站点上所解释的)是“XML字段不更新,因为Linq-to-sql不处理XElement.Changed事件”.
对于我的实现,工作的代码最终看起来像这样:
MyXElementProperty.SetElementValue("Author",author); MyXElementProperty = new XElement(MyXElementProperty);
作为参考(对任何找到这个问题的人),以下内容也起作用:
MyXElementProperty = new XElement(MyXElementProperty); MyXElementProperty.SetElementValue("Author",author);