問題:
我使用linq to sql,已經将資料源拖放到了form上面,修改其中某條記錄的外鍵屬性的時候,出現異常,
ForeignKeyReferenceAlreadyHasValueException
表示在已經加載實體的情況下嘗試更改外鍵時發生的錯誤。
這樣就出現問題了,如果要修改記錄,必須要加載它,才能在datagridview裡面顯示出來,但是加載後卻不能修改外鍵限制的列,怎麼辦?我原以為隻要修改的值符合外鍵限制就行的,難道隻要記錄建立就不能修改任何鍵值,包括主鍵和外鍵? 原來,外鍵表明這條記錄指向另外一條記錄,也就是指向他的父記錄,是以,不能直接修改外鍵的值,而是将條記錄所指向的父記錄對象更改一下,系統就自然修改了外鍵了。 比如兩個表: create table class -- 班級表
(
class varchar ( 10 ) not null ,
specialty varchar ( 40 ), -- 專業
)
go
alter table class
add constraint pkClass primary key (class)
go
create table student -- 學生表
(
studentID int not null ,
names varchar ( 12 ) not null ,
class varchar ( 10 ),
)
go
alter table student
add constraint pkStudentID primary key (studentID)
go
alter table student
add constraint class$have$student foreign key (class) references class
go
班級記錄有兩個: 234 主機闆 235 計算機 學生表有如下記錄: 1 張三 234 2 李四 234 要修改李四成為235班,不能直接 var o = db.student.single(s => s.studentID == 2); o.class = 235; 這樣會報錯ForeignKeyReferenceAlreadyHasValueException 應該是 var o = db.student.single(s => s.studentID == 2); o.班級(指向父記錄的那個變量) = db.class.single(c => c.class == 235); 也就是說,沒有直接把學生的父記錄改為指向班級裡面235的那個記錄。搞定。