带有键的EF抽象基类,派生类具有不同的键

时间:2013-11-20 21:58:06

标签: c# entity-framework

时间愚蠢的问题。我认为数据库设计很棘手,但我对其中的部分内容并不多。我在数据库“Table1”中有一个表,然后是“Table2”,它基本上是Table1的扩展(我也有Table3,Table4等)。我的问题是Table2拥有它自己的唯一键,即使它是一对一的关系。然后Table2Component使用Table2Id作为它的外键。但是,当我尝试在我的代码中使用它时,我认为它指向Table1Id。我收到错误消息:

  

System.Data.Entity.Edm.EdmAssociationConstraint ::参照约束的从属角色中的所有属性的类型必须与主体角色中的相应属性类型相同。实体'Table2Component'上的属性'Table2Id'的类型与引用约束'Table2Component_Table2'中实体'Table2'上的属性'Table1Id'不匹配。

这是代码

[Table("Table1")]
public abstract class Table1
{
    [Key]
    [Column("table1_id")]
    public string Table1Id { get; set; }

    [Column("name")]
    public string Name { get; set; }

    [Column("type_cd")]
    public string TypeCode { get; set; }
}

[Table("Table2")]
public class Table2 : Table1
{
    [Key]
    [Column("table2_id")]
    public int Table2Id { get; set; }

    [ForeignKey("Table1Id")]
    public virtual Table1 Table1 { get; set; }

    // this table also has a table1_id column
    // but I guess I don't need it here, correct?

    [Column("column1")]
    public string Column1 { get; set; }

    public virtual ICollection<Table2Component> Table2Components { get; set; }
}

[Table("Table2Component")]
public class Table2Component : ISubItem
{
    [Key]
    [Column("table2_component_id")]
    public int Table2ComponentId { get; set; }

    [Column("table2_id")]
    public int Table2Id { get; set; }

    [Column("description")]
    public string Description { get; set; }

    public bool Required { get { return true; } }

    [ForeignKey("Table2Id")]
    public virtual Table2 Table2 { get; set; }
}

有什么建议吗?我是否应该更加努力地尝试更改数据库?

1 个答案:

答案 0 :(得分:1)

作为评论开始....完成简单的答案,因为没有其他人跳进来。

搜索实体框架1:1关系,例如https://stackoverflow.com/a/14997417/1347784限制是两个表在使用1:1时必须具有相同的外键

不一定更好的数据库设计。这就是EF团队构建框架的原因。我学会了忍受这些限制。在代码第一个场景中,没什么大不了的。当您从数据库开始时,尝试使用powertool来反向设计替代方法。 EF将使用1:M,即使您可能将其视为1:1。在我看来也行。