老朱的博客

Linq to SQL 级联更新的问题。

Linq to SQL 的更新非常简单只需要调用Datacontext的SubmitChanges就可以。
目前同一个Datacontext实例中很多动作都非常顺利。但在分层应用,对象的更新是在不同的Datacontext实例中,这时就会变得复杂得多。
现在遇一问题查了很长时间,不知道是不是Linq to SQL的一个BUG。
           //Page是PageC的一个子对象
            DataClasses1DataContext cxt = new DataClasses1DataContext("server=.;database=xxx");
            PageC c= cxt.GetTable<PageC>().FirstOrDefault(p => p.PageCName == "test1");
            c.PageCTitle = "test1";
            c.Page.PageTitle = "test2";
            cxt1.SubmitChanges();
 这样Page表和PageC表都更新成功了。

但是如果:

            DataClasses1DataContext cxt = new DataClasses1DataContext("server=.;database=xxx");
            PageC c= cxt.GetTable<PageC>().FirstOrDefault(p => p.PageCName == "test1");
            c.PageCTitle = "test1";
            c.Page.PageTitle = "test2";

            
            DataClasses1DataContext cxt1 = new DataClasses1DataContext("server=.;database=xxx");
            cxt1.GetTable<PageC>().Attach(c,true);
            cxt1.SubmitChanges();
更新就会发生错误。

在不同的Datacontext实例,如果需要更新必须用Attach方法把对象实例Attach到数据环境中。但更新就会发生错误。

错误的原因是:在第一段代码中cxt.GetChangeSet()中 ModifiedEntities(修改的实体)是两个,但在第二段代码中 cxt2.GetChangeSet()中,ModifiedEntities(修改的实体)和AddedEntities(增加的实体)各有一个,也就是说第二段代码中是把Page子对象的更新是放到添加的实体中。而原本这个记录就存在,这时就会发生主键冲突的错误。

是Linq to sql 的一个Bug?

posted on 2007-08-02 00:30  Axel  阅读(2553)  评论(13编辑  收藏  举报

导航