0

采用以下 C# 代码。我正在尝试创建ClassC具有复合键的名称,但也在其中创建可用作另一个表中的外键的标识ClassD。我宁愿使用这个外键而不是尝试映射看起来有点奇怪的复合键。

public class ClassA
{
    [Key]
    public int ClassAID { get; set; }
    public virtual ICollection<ClassC> SomeClassCs { get; set; }
}

public class ClassB
{
    [Key]
    public int ClassBID { get; set; }
    public virtual ICollection<ClassC> SomeClassCs { get; set; }
}

public class ClassC
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ClassCID { get; set; }

    [Key, Column(Order=0), ForeignKey("SomeA")]
    public int ClassAID { get; set; } //Foreign Keys combined as Primary Key

    [Key, Column(Order=1), ForeignKey("SomeB")]
    public int ClassBID { get; set; }

    public virtual ClassA SomeA { get; set; }
    public virtual ClassB SomeB { get; set; }

}

public class ClassD
{
    [Key]
    public int ClassDID { get; set; }

    [ForeignKey("SomeC")]
    public int ClassCID { get; set; }
    public virtual ClassC SomeC { get; set; }
}

在创建我的迁移时,我收到以下错误:

System.Data.Entity.Edm.EdmAssociationConstraint::关系约束中的从属角色和主体角色中的属性数量必须相同。

有人解决了这个问题,还是我处理错误?

4

2 回答 2

1

“我宁愿使用这个外键而不是尝试映射看起来有点奇怪的复合键”

您在谈论自然键与代理键

这就是我所做的:

  1. 在我的所有模型上使用身份(代理)键
  2. 通过覆盖上下文类中的 ValidateEntity 来验证数据 -防止实体框架中的重复
  3. 向自然键添加唯一索引 - 在迁移中创建索引

实体框架不提供数据注释属性来识别作为自然键或应该具有唯一索引的属性 - 但如果您查看我提供的链接中的答案,您会看到有些人为此目的创建自定义属性

于 2013-09-11T14:35:02.923 回答
0

Dependent 实体的外键应包含 Principal 的所有主键。您可以在TechNet上阅读有关外键约束的更多信息。

你有两个主键,所以你应该为这个关系ClassC有两个外键。ClassD或者您可以将ClassCID其设为单个主键,然后您的ClassD外键映射将起作用。无论如何 - 从属表的外键应该与主表中的主键完全相同。

于 2013-09-10T23:00:46.467 回答