一、前段时间对于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不成熟,通过深入的调试解决了问题后才发现是自己不成熟,也是过于迷信入门数据的结果。实际上我们也没有时间把什么都学的扎实才开发项目,那么我们就什么事也做不成,也不会有进步,只有带着问题前进,才能更快的把新技术应用到开发项目中,在运动中把自行车学会。