背景:用Linq to sql 开发系统,两个父子关系的表,例如A表和B表,B表中含有A表的主键A_ID作为B表的外键,如果B表中的A_ID时,使用了如下的写法:
MyDataContext db
=
new
MyDataContext();
var b1 = (from b in db.B where b.ID == 6 select b).Single();
b1.A_ID = 5 ;
db.SubmitChanges();
var b1 = (from b in db.B where b.ID == 6 select b).Single();
b1.A_ID = 5 ;
db.SubmitChanges();
这样写的话,将会得到以下错误:
“
/
”应用程序中的服务器错误。
--------------------------------------------------------------------------------
对象的当前状态使该操作无效。
说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException: 对象的当前状态使该操作无效。
--------------------------------------------------------------------------------
对象的当前状态使该操作无效。
说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException: 对象的当前状态使该操作无效。
原因在于这种写法破坏了ORM的关联结构,应该改写为如下代码:
MyDataContext db
=
new
MyDataContext();
var b1 = (from b in db.B where b.ID == 6 select b).Single();
b1.A = (from a in db.A where a.ID == 5 select a).Single();
db.SubmitChanges();
var b1 = (from b in db.B where b.ID == 6 select b).Single();
b1.A = (from a in db.A where a.ID == 5 select a).Single();
db.SubmitChanges();