天天看點

我終于解決了ForeignKeyReferenceAlreadyHasValueException問題

問題:

我使用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的那個記錄。搞定。