2010-10-12 60 views
2

我有這樣的數據庫結構:實體框架,TPT繼承和多語言支持

服務

  • ID INT PK
  • 類別編號FK
  • SomeOtherFields

LocalizedService

  • LocalizedServiceId PK
  • LanguageId FK
  • 名稱
  • 說明

正如你所看到的,我有一個叫做服務基地臺,以及LocalizedService表,其中我編寫多語言數據,如名稱和描述,應該用不同的語言翻譯。 我已經使用TPT繼承鏈接了EF設計器中的兩個表。 Service是LocalizedService的基類。問題是,TPT要求兩個表都有主鍵,如果我使用1種語言,這不會成爲問題,但我應該翻譯3種不同語言的服務行。因此,只有LocalizedServiceId不應該是唯一的,但是LocalizedServiceId + LanguageId的組合應該是唯一的,因爲我無法在LocalizedService中插入多個語言行。例如,看看LocalizedService行波紋管:

  • 1,1,SomeService,NULL < - 插入
  • 2,1,AnotherService,NULL < - 插入
  • 2,2,RussianTranslationService ,NULL < - 無法插入,因爲表中已存在值爲2的LocalizedServiceId。

這不是在DB端的問題,我可以創建多個字段PK(例如,LocalizedServiceId和LanguageId都將是主鍵),但在這種情況下,EF設計師拋出錯誤說: 「錯誤13錯誤75:密鑰用法無效uPay.Data.Entities.LocalizedServiceRecord無法定義密鑰,因爲它的一個基類(uPay.Data.Entities.ServiceRecord)定義密鑰D:\ Projects \ uPay \ uPay.Data.Entities \ Entities.edmx 1531 9 uPay.Data.Entities「。我真的很需要這個問題的解決方案,你的幫助將非常感激。

回答

2

從EDM獲得的錯誤來自於EF支持2對一對一關聯上的2個實體之間的TPT繼承這一事實,這意味着數據庫上存在一對一關係,並且基本上要求兩個表都具有非常主鍵。您的場景基本上是一對多的關係,其中每個服務都可以有許多基於ServiceID和LocalizationID的本地化。

有跡象表明,已經在他的職位here的方式提出通過克雷格斯頓茨 2種解決方法,第一個是要深入到EDM的SSDL部分,並從重點節中刪除LanguageId:

<EntityType Name="ServiceTypeLocale"> 
    <Key> 
     <PropertyRef Name="LocalizedServiceId" /> 
     <!-- You have to comment this:--> 
     <!--<PropertyRef Name="LanguageId" />--> 
    </Key> 
... 

這是不推薦的方式,因爲如果你從數據庫做到這一點,則更新模型嚮導將嘗試在每次你做一個更新時間「修復」你的映射。

另一個解決方法是在數據庫中創建視圖並模擬一對一關係,然後映射視圖而不是ServiceLocalization表。