【发布时间】: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