2010-07-08 109 views
2

我有位舊的數據庫的工作,但這裏的基本思想是:LINQ的2 SQL,不能創建協會

Item 
Id INT PK NOT NULL 
Description VARCHAR(50) NOT NULL 
TranslationId INT NULLABLE 

Translation 
Id INT PK NOT NULL 
Language VARCHAR(10) PK NOT NULL 
Translation VARCHAR(50) NOT NULL 

基本上每一個項目可能有很多翻譯,似乎很簡單。這些表沒有外鍵,因此我正在手動嘗試在DBML中創建關聯,但由於翻譯表中翻譯ID與PK之間的空值不同,因此它失敗。

有反正我能得到這個協會的工作,如:

item.Translations 

錯誤消息: 無法創建一個協會「Item_Translation」。屬性沒有匹配的類型:「TranslationId」,「Id」。

我知道它與TranslateId可爲空,因爲另一個與Translations關聯的表可以正常工作,但其TranslationId列不爲NULL。從翻譯

的樣本數據:

Id Language Translation 
1 en-us some text 
1 en-gb some text 
2 en-us some text 
2 en-gb some text 

回答

2

目前您已在此設置,使翻譯可以有很多的項目,而不是你的方式說明,其中一個項目可以有許多翻譯。要解決該問題,您需要在Translation表中使用itemId,並從Item表中刪除translationId

一旦你得到了照顧,如果你有麻煩,請發佈你所得到的錯誤信息。

編輯:

LINQ 2 SQL沒有內置認識到什麼你正在嘗試做的。當你創建一個外鍵時,你可以用文字說出來,父母有很多孩子。父級擁有主鍵,子表具有指向該主鍵(外鍵)的指針。你如何設定這是相反的。在你的情況下,你不是鏈接完整的主鍵,而是提供足夠信息來反轉關係的主鍵的一部分。

我知道你的問題,需要鏈接多個表格的翻譯表,所以我通常會在這裏重新設計。既然它看起來在做你正在尋找的東西,我會將它保存到另一個線程中。我的建議是將您自己的屬性添加到類中,並刪除設計器中的關聯。

您可以直接在設計師的任意位置單擊,然後選擇查看代碼,然後只需手動添加的屬性:

namespace MyNamespace 
{ 
   // put your using statements inside the namespace for this file!!! 

   partial class Item 
   { 
       public IQueryable<Translation> Translations 
       { 
           MyDataContext dc = new MyDataContext(); 
           return dc.Translations.Where(t => t.Id == this.translationId); 
       } 
   } 
} 
+0

對不起,我在原來的崗位上做出了一個錯誤,這兩個ID和語言翻譯表是PK。 此外,多個表格參考此表格進行翻譯。 – 2010-07-08 14:29:30

+0

由於NULL的差異,關聯失敗仍然沒有意義。外鍵允許爲空,這只是表示該項目沒有翻譯。你能發佈你正在得到的確切的錯誤信息嗎? – 2010-07-08 14:37:50

+0

我不得不提一提,獨立的值'Translation.Id'並不是完整的主鍵,因爲它本身就足夠了。數據庫中的外鍵將無法直接鏈接到Id,您也必須包含該語言。我不確定這是否與LINQ 2 SQL問題有關。確切的錯誤信息會有很大的幫助。 – 2010-07-08 14:39:11