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?