加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 06:14:37 所属栏目:百科 来源:网络整理
导读:一些背景:我有一个数据库,我想使用 linq-to-sql来更新C#应用程序.此表中的其中一列具有 XML数据类型. 该表中的其他列(不是XML数据类型)更新完好,但是当我对XML字段进行更改时,该程序正确执行(看似),但该字段始终保留其原始值运行SubmitChanges(). 我在互联
一些背景:我有一个数据库,我想使用 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具有原始值的缓存副本,然后将其与新值进行比较.如果通过复制引用来获取“缓存副本”,那么无论你对该对象做什么,它总是会认为这两个是相等的.如果你创建一个新的元素,然后改变它,那么旧对象仍然会有旧的值,所以比较会明白你已经做了修改.那有意义吗?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读