使用 EF Code First 在同一表上定义组合键和标识

本文关键字:定义 组合 标识 Code EF First 使用 | 更新日期: 2023-09-27 18:31:01

采用以下 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.EdmAssociation约束: : 关系中从属角色和主体角色中的属性 约束必须相同。

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

使用 EF Code First 在同一表上定义组合键和标识

"我宁愿使用这个外键,而不是试图映射复合 钥匙似乎有点奇怪"

您正在谈论自然键与代理键

这就是我所做的:

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

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

依赖实体的外键应包含主体的所有主键。您可以在 TechNet 上阅读有关外键约束的详细信息。

ClassC上有两个主键,因此,对于此关系,您应该ClassD有两个外键。或者,您可以将ClassCID设置为单个主键,然后ClassD外键的映射将起作用。在任何情况下 - 依赖表的外键应与主表中的主键完全相同。