具有Entity Framework Code First和Inherited Class的外键

时间:2013-12-17 16:24:54

标签: c# entity-framework entity-framework-5

我有一个公司和员工类,都来自Holder类。 我在EntityFramework 5中使用Table per Type,在数据库中创建它们

我有一个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检索Employee或Company的操作都会返回以下错误:“属性'标识'是对象关键信息的一部分,无法修改“

我发现在我的CheckinTool表中它有一个名为“IdHolder”的列,它在Holder表中有一个Id的外键,而我的Employee和Company表有一个Id的外键,也在Holder中

IMO我以一种糟糕的方式解决了这个问题。

我刚刚将CheckinTool类中的EmployeeCompany属性类型从Holder更改为int 但我觉得有些东西不适合这个解决方案。

任何人都知道如何在不需要更改EmplotyeeCompany属性的情况下解决它?

提前致谢

1 个答案:

答案 0 :(得分:0)

CheckInTool应该有两列带有fks,一列是toIntId表(基类),另一列是Holder表(肯定是Holder属性)。

我怀疑你对表的映射存在错误。您是否为每个类创建了一个表,包括IntId和Holder?