none
Linq 多层结构 更新对象的问题 RRS feed

  • 问题

  • 我在服务层收到一个对象 entityset<childtable> 子列表,如果是调用
      DataContext.parenttbl.InsertOnSubmit(t);
                DataContext.SubmitChanges();
    可以将t中包含的childtable 子项全部插入到数据库中

    但如果我将对象使用
    DataContext.parenttbl.attach(t,true);
                DataContext.SubmitChanges();
    只能修改parent对象的值,对于子项不做任何反应
    有什么好的办法可以直接将子项更新,插入,删除,对应到数据库中?
    如果子项还有相关的再下一级别的子表能一起处理么?

    2009年6月24日 3:52

答案

  • 恩~是没有状态的~所以要自动判断可能需要查询数据库消耗一定的资源~也许是这样的考虑所以要显示地attach
    宠辱不惊,看庭前花开花落。去留无意,望天上云卷云舒。
    2009年6月24日 11:19
    版主

全部回复

  • http://msdn.microsoft.com/zh-cn/library/bb548978.aspx
    这上面说若要更新子集合的成员,必须显式调用 Attach,并指定该实体。
    宠辱不惊,看庭前花开花落。去留无意,望天上云卷云舒。
    2009年6月24日 9:36
    版主
  • "调用 SubmitChanges 后,子集合的成员将被置于 Unmodified 状态。若要更新子集合的成员,必须显式调用 Attach,并指定该实体。 "
    这句话什么意思?子集合成员直接调用attach(childlist,true),因为子集合成员有增加删除,和更改,还是得自己想个机制进行跟踪吧,
    关键一个级别还好办,关键可能子集合的对象还有再下一级别的对象的集合成员。
    如何处理?


    2009年6月24日 9:44
  • 它的意思应该是当你每修改了一个实体以后就要显示去 Attach 一下~它不自动去找子集是否做了修改~可能是出于性能考虑吧~
    宠辱不惊,看庭前花开花落。去留无意,望天上云卷云舒。
    2009年6月24日 9:51
    版主
  • 那我知道了就是整个对象多个级别的集合中的对象,自己维护一个状态是更新了,还是新增的,还是删除了,按照各个级次进行对应的操作后调用SubmitChanges()就行了。好像让客户端和服务层进行直接对象交互好像很麻烦,好像还是按照表的结构进行传递比较容易实现。到底哪个方案好呢。

    2009年6月24日 10:06
  • 可以只把修改过的表传递到服务层~然后服务层将这些表的更新再提交到数据库~
    宠辱不惊,看庭前花开花落。去留无意,望天上云卷云舒。
    2009年6月24日 10:14
    版主
  • 因为修改过的表对应的对象,已经经过序列化,传递回来没有状态,还是要自己维护状态,本来想通过对象的级次关系一次提交减少与wcf这一服务的交互次数,但好像实现起来复杂度增加了,最傻的办法就是每个子对象的每次修改,增加,删除,都有按钮,直接提交到对应层次的表,进行对应的更新,这样打开一个有多个级别的对象保存按钮太多了,每个对象都要对应一个。也不是什么好的方法。

    2009年6月24日 10:26
  • 恩~是没有状态的~所以要自动判断可能需要查询数据库消耗一定的资源~也许是这样的考虑所以要显示地attach
    宠辱不惊,看庭前花开花落。去留无意,望天上云卷云舒。
    2009年6月24日 11:19
    版主