C# 首先是实体框架代码和继承类的外键

C# 首先是实体框架代码和继承类的外键,c#,entity-framework,entity-framework-5,C#,Entity Framework,Entity Framework 5,我有一个Company和Employee类,它们都继承自Holder类。 我在EntityFramework 5中使用每种类型的表来在数据库中创建它们 我有一个CheckinTools类,它使用我的Holder类 public class Company : Holder { public virtual string Email { get; set; } public virtual string Phone { get; set; } } public cl

我有一个Company和Employee类,它们都继承自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的外键,而我的Employee和Company表在Holder表中也有一个指向Id的外键

我用一种糟糕的方式解决了这个问题

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

有人知道如何解决这个问题而不必改变EmployeeCompany的财产吗


提前感谢

CheckInTool应该有两列带有fks,一列是toIntId表(基类),另一列是ToHolder表(确保Holder属性)


我怀疑您的表映射有缺陷。您是否为每个类(包括IntId和Holder)创建了一个表?

我不知道问题出在哪里,因为我从未使用注释定义对象和表之间的映射。请考虑使用FLUENT API。他不使用注释来映射。注释告诉EF它是一个键,应该自动生成。我使用fluent API只是为了用实体框架应用每种类型的表,但是我需要使用哪种注释?很抱歉,我不理解你的评论,MaessI为Holder创建了一个表,但不是为IntId创建的(IntId不由我的上下文映射,IntId作为Id列包含在我拥有的每个表中。当这些表由实体框架创建时,它们的映射如下:Employee=PrimaryKey-->Id;-->ForeingKey-->Holder表中的Id--Company=PrimaryKey-->Id;-->ForeingKey-->Holder表中的Id--CheckinTool=PrimaryKey-->Id;-->ForeingKey-->支架表中的Id和工具表中的Id--Holder=PrimaryKey-->Id;否ForeingKey@RafaelMiceli在这种情况下,请尝试将IntId设置为接口而不是基类。