谈VS2008+Silverlight3+WCF+LINQtoSQL的数据更新(回复:websco)

海涵德 2010-04-21 11:41:18
一、前段时间对于WCF+LinqToSQL的数据更新,我使用的办法是:

.attach(modified_entity,original_entity)
.SubmitChanges()

这种更新方式要在Silverlight端代码中不断记忆原始的实体(original_entity),给程序代码编写带来麻烦。在于websco(Sunpire)讨论关于数据更新问题时发现他也遇到这样的麻烦,我们为此讨论了一晚上至深夜,他把这种数据更新方式称为“整体更新”,虽然他认为这种数据更新方不好,但也提不出新的解决办法。其实之前我也觉得这种数据更新办法确实有问题,不得已又花了点时间调试代码,试图找出解决办法。
二、又试了其他两个解决办法
方法一
.attach(modified_entity)
.SubmitChanges()
方法二
.attach(modified_entity,true)
.SubmitChanges()

第一种反法,可以正确执行,但是没有结果,数据没有被更新;
第二种方法,不能正确执行,返回错误提示:“如果实体声明了版本成员或者没有更新检查策略,则只能将它附加为没有原始状态的已修改实体。”,错误提示我没有看明白,只好求助与帮助文件如下:

其中有一段话讲得正好是这个意思,这段话在图中已经标出,具体如下:
备注
如果以修改状态附加,则实体必须声明一个版本号或不得参与更新冲突检查。附加新的实体后,将会初始化所有子集合(例如,关联表中的实体的 EntitySet 集合)的延迟加载程序。调用 SubmitChanges 后,子集合的成员将被置于 Unmodified 状态。若要更新子集合的成员,必须显式调用 Attach,并指定该实体。

看到这里我基本明白了怎样做了。
三、得到正确的方案
回到项目中修改了LingToSQL项目中的student实体的每个属性的“更新检查”项选择“从不”,操作如图:



事情再次得到圆满的解决,经过这样的修改,使用方法二就不返回错误了,并能够成功的更新数据。
四、体会
由于赶开发进度,看到silverlight这个好东西买了几本入门的书就匆匆上路了,由于迷信这些入门的书,没有深入的调试就开始赶进度了,因此带来了这么多问题,开始还以为是siliverlight不成熟,通过深入的调试解决了问题后才发现是自己不成熟,也是过于迷信入门数据的结果。实际上我们也没有时间把什么都学的扎实才开发项目,那么我们就什么事也做不成,也不会有进步,只有带着问题前进,才能更快的把新技术应用到开发项目中,在运动中把自行车学会。




...全文
422 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
shshshdy 2012-10-23
  • 打赏
  • 举报
回复
我找到了知道办法了,提供的其中一个重载有直接解决方案

Attach(entity,original)
方法参数告诉我们的意思很明显,但是在做的过程中思维定式。
原因 original 原始的数据不能和当前 attach将要执行的 连接使用同一个

下面代码片断
using (NetTongJIDB db = new NetTongJIDB(conn))
{
foreach (LYDWXXDc item in list)
{
using (NetTongJIDB db2 = new NetTongJIDB(conn))
{
var q = db2.LYDWXXDc.Single(l => l.ID == item.ID);
db.LYDWXXDc.Attach(item, q);
db.SubmitChanges();
}
}

}
royalsily 2010-11-11
  • 打赏
  • 举报
回复
支持·~~ 支持~~~
Joetao 2010-05-10
  • 打赏
  • 举报
回复
很好的文章!这几天也为 数据库的操作纠结着!
websco 2010-04-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jv9 的回复:]
引用 2 楼 madaming 的回复:
jv9这么晚了还不休息,真辛苦你了。


呵呵~我这里刚早晨,刚来公司上班。
你这是熬夜写文章,才是真正的辛苦。
你每次的总结都非常详细,是很不错的参考资料哦。
[/Quote]

冷大大太伤我心了,我发的贴子都不去踩一下哈
websco 2010-04-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 madaming 的回复:]
虽然他认为这种数据更新方不好,但也提不出新的解决办法
[/Quote]

我不是早就发了解决办法了么? 我还是喜欢对子表进行判断的做法,自己控制的代码,稳当。
http://topic.csdn.net/u/20100418/22/fc01cf9b-b7bd-404c-b46a-77be1adb9333.html

建议:
1. 你跟踪一下这种自动更新的方法,看看生成的SQL如何;
2. attach(modified_entity,true) 是要求 modified_entity 有“时间戳”的,可是如果主键不是自增的int型,我测试的是在新增时会出错,可能是我设置不对;
3. 最好是在EF 1.0、2.0中也找找相应的方法啦
jv9 2010-04-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 madaming 的回复:]
jv9这么晚了还不休息,真辛苦你了。
[/Quote]

呵呵~我这里刚早晨,刚来公司上班。
你这是熬夜写文章,才是真正的辛苦。
你每次的总结都非常详细,是很不错的参考资料哦。
海涵德 2010-04-21
  • 打赏
  • 举报
回复
jv9这么晚了还不休息,真辛苦你了。
jv9 2010-04-21
  • 打赏
  • 举报
回复
谢谢楼主分享经验。

8,736

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧