2012-05-29 72 views
0

我正在使用Linq 2 Sql敲出一個快速定製的CMS。Linq to Sql插入衝突「外鍵同一表約束」錯誤

我有一個關聯到自己的表,以便任何兒童菜單都映射到同一個表內的任何父菜單,但我有問題插入第一個父。

表看起來有點像這樣:

CMSMenu 
    CMSMenuID 
    ParentCMSMenuID  
    Name 
    Link 

隨着

CMSMenu.CMSMenuID -> CMSMenu.ParentCMSMenuID 

協會在以前版本的數據庫/碼的我只想補充像一些代碼:

itm = new CMSMenu(); 
    itm.ParentCMSMenuID = 0; 
    rep.CMSMenus.InsertOnSubmit(itm); 

但由於此數據庫是使用所有外鍵自動創建的,因此此代碼會導致一個excep重刑:

INSERT語句衝突與外鍵相同的表 約束「CMSMenu_CMSMenu」。衝突發生在數據庫 「sp.ackahs」,表「dbo.CMSMenu」,列'CMSMenuID'中。陳述 已被終止。

如何插入頂級菜單(即沒有父級)?

,因爲它不具有父,所以我不能添加:

itm.MyParentCMSMenu=*existing cmsmenu item*; 

,因爲我可以用一個孩子的菜單,也沒有我可以添加:

itm.MyParentCMSMenu=null; 

任何想法歡迎。

感謝 託比

+1

您可以將MyParentCMSMenu設置爲SQL中的可空列嗎? – GrandMasterFlush

+0

是的....我覺得有點傻,我期待這是因爲CMSMenuID不會爲空並且ParentCMSMenuID會是關聯中的錯誤。感謝那。 – TheMightyBush

回答

0

通常用於CMSMenu項目的一個特殊版本。它可以被命名爲「空」並且具有ID 0或1.它應該被用作實際上沒有父項的項目的父項。它應該從所有查詢中過濾掉。

這是關係數據庫的弱點之一 - 你需要使用各種怪癖來存儲簡單的抽象如樹。