【问题标题】:EF abstract base class with key where derived class has different key带有键的EF抽象基类,其中派生类具有不同的键
【发布时间】:2013-11-22 06:58:51
【问题描述】:

是时候问一个愚蠢的问题了。我认为数据库设计很糟糕,但我对此无能为力。我在数据库“Table1”中有一个表,然后是“Table2”,它本质上是 Table1 的扩展(我也有 Table3、Table4 等)。我的问题是 Table2 有它自己的唯一键,即使它是一对一的关系。然后 Table2Component 使用 Table2Id 作为它的外键。但是,当我尝试在我的代码中使用它时,我认为它指向 Table1Id。我收到错误消息:

System.Data.Entity.Edm.EdmAssociationConstraint: : 引用约束的Dependent Role中所有属性的类型必须与Principal Role中对应的属性类型相同。实体“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; }
}

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

【问题讨论】:

  • 搜索Entity Framework 1:1 relationship 例如stackoverflow.com/a/14997417/1347784 限制是两个表在使用1:1时必须具有相同的外键
  • 感谢您的帮助。一般来说,将 Table1 的主键也作为 Table2 的主键是不是更好的数据库设计?然后我猜 Table2Component 会将 Table1Id 作为外键。
  • 不一定是更好的数据库设计。正是 EF 团队构建框架的原因。我学会了忍受这些限制。在代码优先的场景中,没什么大不了的。尝试使用 powertool 对替代方法进行逆向工程。 EF 将使用 1:M,即使您可能将其视为 1:1。在我看来也不错。

标签: c# entity-framework


【解决方案1】:

以评论开始....以简单的答案结束,因为没有其他人加入。

搜索 Entity Framework 1:1 关系 eghttps://stackoverflow.com/a/14997417/1347784 限制是两个表在使用 1:1 时必须具有相同的外键

不一定是更好的数据库设计。这正是 EF 团队构建框架的原因。我学会了忍受这些限制。在代码优先的情况下,没什么大不了的。当您开始使用数据库时,请尝试使用 powertool 对替代方法进行逆向工程。 EF 将使用 1:M,即使您可能将其视为 1:1。在我看来也不错。

【讨论】:

  • 感谢您的帮助。我想我要分享主键。这对我来说更有意义,并且会让事情变得更容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 2023-03-14
  • 2023-03-25
  • 2017-06-21
  • 2015-05-13
  • 1970-01-01
相关资源
最近更新 更多