2013-12-17 44 views
1

我有一個公司和員工類,都從Holder類繼承。 我使用EntityFramework 5的每種類型的表,在數據庫中創建它們具有實體框架的外鍵代碼優先和繼承類

我有一個CheckinTools類,它使用我的Holder類。

public class Company : Holder 
{  
    public virtual string Email { get; set; } 
    public virtual string Phone { get; set; } 
} 

public class Employee: Holder 
{ 
    public virtual string Phone { get; set; } 
    public virtual string LastName { get; set; } 
} 

public class Holder: IntId 
{ 
    public virtual string Name { get; set; } 
}  

public class CheckinTool: IntId 
{ 
    public virtual Holder EmployeeCompanyHolder { get; set; } 
    public virtual Tool Tool { get; set; } 
    public virtual DateTime CheckinDateTime { get; set; } 
} 

public class IntId 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
} 

當我測試我的MVC應用程序的一切CRUD,直到我創建了一個CheckinTool,我創建了一個CheckinTool,任何操作按ID檢索員工或公司後工作正常返回以下錯誤:「屬性'Id'是對象的關鍵信息的一部分,不能修改「

我觀察到,在我的CheckinTool表中它有一個名爲」IdHolder「的列,在Holder表中有一個Id的外鍵,而我的員工和公司表有一個外鍵到Id,也在持有人

IMO我解決了問題一個壞方法。

我剛剛將CheckInTool類中的EmployeeCompany屬性類型從Holder更改爲int 但我覺得某些東西不適合此解決方案。

任何人有任何想法如何解決它,而無需更改EmplotyeeCompany屬性?

在此先感謝

+0

我不知道問題是什麼,因爲我從來沒有使用過註釋來定義對象和表之間的映射。請考慮使用Fluent API。 – mostruash

+0

他沒有使用註解來映射。註釋告訴EF它是一個Key,應該是自動生成的。 – Maess

+0

我只是使用流利的API來應用每個類型的表與實體框架,但我需要使用哪個註釋?對不起,我不理解你的評論Maess –

回答

0

CheckInTool應該有兩列與FKS,一個toIntId表(基類)和一個夾表(一定要持有物業)。

我懷疑你映射到表有一個錯誤。你是否爲每個類創建了包括IntId和Holder的表?

+0

我爲Holder創建了一個表,但不是IntId(IntId沒有被我的上下文映射,IntId作爲每個表中的Id列被包含在內 當這些表是由Entity框架創建的,它們如下映射: Employee = PrimaryKey - > Id; - > ForeingKey - > Id在Holder表中 - Company = PrimaryKey - > Id; - > ForeingKey - - >在持有人表中的Id - CheckinTool = PrimaryKey - > Id; - > ForeingKey - >持有人表中的Id和工具表中的Id - 持有人= PrimaryKey - > Id;無ForeingKey –

+0

@RafaelMiceli in這種情況下,嘗試使IntId接口,而不是基類。 –

+0

我會盡力,謝謝 –

相關問題