2010-07-30 59 views
0

在下面的代碼中,我不相信我正在更改外鍵,但我可能是錯的。當我運行它,我得到異常:ForeignKeyReferenceAlreadyHasValueException當不嘗試更改外鍵?

ForeignKeyReferenceAlreadyHasValueException

下面是代碼:

UsersModule um = dc.UsersModules.Where(x => x.UserId == IdParam).FirstOrDefault(); 
int oldModuleId = um.ModuleId; 
string oldModule = um.Module.ModuleName; 

將引發錯誤就行了:

string oldModule = um.Module.ModuleName 

我不知道爲什麼我得到這個錯誤,因爲我只是試圖存儲值o f ModuleName轉換爲字符串oldModule,不改變um.Module.ModuleName

+0

嘗試查看清單文件.dbml後面的生成代碼文件。假設您使用設計器來添加L2S類。試着看看是否有異常投入獲得者。 – 2010-07-30 14:46:11

+0

我看了看,它被扔進了geter。 – Xaisoft 2010-07-30 14:46:48

+0

我輸了。我試圖重現這個沒有運氣。我製作了兩張桌子,其中一張帶有一個外鍵。說B - > A.然後我從B得到一個項目,並嘗試通過B ojebct訪問A對象並讀取As name(非關鍵字)。像這樣B b = dc.Bs.First();字符串s = b.A.Name;它的工作.. – 2010-07-30 15:01:37

回答

0

LINQ基於關係實體工作。因此,無論何時需要設置/讀取外鍵值,都必須通過設置/讀取外鍵實體來完成。這意味着諸如「Module.ModuleName」之類的快捷方式不能很好地工作。

+0

我認爲上面的代碼應該工作。這是Linq to Sql的一個很酷的功能。而且他不會試圖改變任何事情,只是閱讀價值觀。 – 2010-07-30 14:35:58

+0

我剛剛修復了我的答案。設置或讀取並不重要。 – 2010-07-30 14:37:02

+0

ok,以便在獲取時解釋錯誤,但ModuleName不是外鍵。你能解釋一下這個外國實體嗎? – Xaisoft 2010-07-30 14:42:25