【问题标题】:Foreign key with Entity Framework Code First and Inherited Class具有实体框架代码优先和继承类的外键
【发布时间】:2013-12-17 16:24:53
【问题描述】:

我有一个 Company 和 Employee 类,它们都继承自 Holder 类。 我将 Table per Type 与 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 的外键

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

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

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

提前致谢

【问题讨论】:

  • 我不知道问题出在哪里,因为我从来没有使用注解来定义对象和表之间的映射。请考虑使用 Fluent API。
  • 他没有使用注释来映射。注释告诉 EF 它是一个 Key 并且应该是自动生成的。
  • 我使用 fluent API 仅用于使用 Entity Framework 应用每种类型的表,但我需要使用哪个注释?对不起,我不明白你的评论 Maess

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


【解决方案1】:

CheckInTool 应该有两列带有 fks,一列 toIntId 表(基类)和一列到 Holder 表(确保为 Holder 属性)。

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

【讨论】:

  • 我为 Holder 创建了一个表,但不是为 IntId(IntId 未由我的 Context 映射,IntId 作为 Id 列包含在我拥有的每个表中。当这些表由实体框架创建时它们的映射如下:Employee = PrimaryKey --> Id; --> ForeingKey --> Holder 表中的 Id -- Company = PrimaryKey --> Id; --> ForeingKey --> Holder 表中的 Id -- CheckinTool = PrimaryKey --> Id; --> ForeingKey --> Holder 表中的 Id 和 Tools 表中的 Id -- Holder = PrimaryKey --> Id; No ForeingKey
  • @RafaelMiceli 在这种情况下,尝试将 IntId 设为接口而不是基类。
猜你喜欢
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-22
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
相关资源
最近更新 更多