c# – 使用XML数据库字段的Linq-to-SQL – 为什么这样工作?

一些背景:我有一个数据库,我想使用 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);

解决方法

当你使它成为一个新的XElement,你正在制作一个不同的对象.有可能检测到“陈旧”,它使用参考平等,这显然将其视为一个新的值.

你在什么时候实际改变元素?我希望LINQ to sql具有原始值的缓存副本,然后将其与新值进行比较.如果通过复制引用来获取“缓存副本”,那么无论你对该对象做什么,它总是会认为这两个是相等的.如果你创建一个新的元素,然后改变它,那么旧对象仍然会有旧的值,所以比较会明白你已经做了修改.那有意义吗?

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...