2014-06-24 47 views
0

我正在使用實體框架,急於加載,我試圖加載我的圖的一部分。 我有候選人和培訓師繼承的Person表,並且當有人同時是培訓師和候選人(注意:培訓師和候選人沒有任何其他屬性,只有從Person繼承的主鍵)時,我有問題。包含繼承實體的導航屬性

這是我的查詢:

RequestInfo ri = context.RequestInfo.Include(x => x.Request).Include(x => x.TeamName).Include(x => x.Sender) 
       .Include(x => x.TrainingLanguage).Include(x => x.TrainingLocation).Include(x => x.CcPerson.Select(p => p.Person)) 
       .Include(x => x.Request.Select(c => c.Candidate)) 
       .Include(x => x.Request.Select(c => c.Candidate).Select(ct => ct.CandidateType)) 
       .Include(x => x.Request.Select(c => c.Candidate.CandidateType.Select(cwp => cwp.CandidateWorkPresence))) 
       .Where(x => x.Id == r.Id).Single(); 

它可能會更好,但我有一個問題是,當一些人是候選人和教練我得到異常以下:

All objects in the EntitySet 'EmployeesTrainingEntities.Person' must have unique primary keys. However, an instance of type 'EmployeesTrainingModel.Candidate' and an instance of type 'EmployeesTrainingModel.Trainer' both have the same primary key value, 'EntitySet=Person;PersonId=5'. 

我試圖找到解決問題的辦法,但我沒有運氣,我看到很多人都有這個問題。也許我錯過了一些東西,所以如果有人有一些解決方案,建議,......這是值得歡迎的。 如果有必要,我會添加一張照片,其中包含我正在嘗試加載的模型的一部分。

編輯: 模型包含RequestInfo實體,它具有關於培訓請求的共同信息。 RequestInfo收集了Requests,0 Sender誰是Person和收集CcPersons(將遵循培訓的人)。包含Candidate

解決方案: 我發現了我的問題的解決方案。當我有人培訓師候選人,我所做的是繼承重疊,而且似乎EntityFramework不允許繼承重疊。所以,我用關聯取代了繼承關係,現在它正常工作。

+0

對您的模型使用繼承看起來不正確。如果'Person'既可以是'Trainer'也可以是'Candidate',則不能從'Person'派生出來,因爲這意味着'Person'只能** ** **培訓師**或**一個「候選人」,但從來都沒有。也許你應該有一個基礎的'Role'實體,並從'Role'派生'Trainer'和'Candidate'。然後給'Person'一個'**'**集合**。 – Slauma

+0

可能會發生某些人既是「培訓師」又是「候選人」。我有培訓師參加某個課程,但在我的過程中,其中一名培訓師可能會使用其他培訓師進行培訓,培訓師將成爲培訓的候選人。當這樣的事情發生時,我不能在我的請求中包含關於候選人的信息,因爲在'Candidate'和'Trainer'這兩個表中都有相同的PersonId。 – Alt

+0

由於我無法添加照片,因此我對該模型的一部分進行了一些額外的解釋,從而對該帖子進行了編輯。 – Alt

回答

0

我沒有看到創建兩個額外的實體,如果他們沒有任何額外的屬性繼承人的觀點。

爲什麼不只是編輯人員表格,以包含PersonRole的enum [flag]屬性。這樣,您可以將多個角色分配給一個用戶並將其存儲在一個int中。

+0

我之所以沒這麼做是因爲後來如果有必要或爲老師或候選人添加一些附加屬性,將會更容易添加一些新角色,因此擴展模型會更容易。即使現在這些派生表也與不同的表相關聯。 – Alt