C# 首先使用EF代码在同一个表上定义复合键和标识

C# 首先使用EF代码在同一个表上定义复合键和标识,c#,entity-framework,ef-code-first,code-first,C#,Entity Framework,Ef Code First,Code First,以下面的C代码为例。我正在尝试创建ClassC,它有一个复合键,但也在其中创建一个标识,可以用作另一个表ClassD中的外键。我宁愿使用这个外键,而不是尝试映射似乎有点奇怪的复合键 public class ClassA { [Key] public int ClassAID { get; set; } public virtual ICollection<ClassC> SomeClassCs { get; set; } } public class Cl

以下面的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; }
}
公共类ClassA
{
[关键]
公共int类援助{get;set;}
公共虚拟ICollection SomeClassCs{get;set;}
}
公共B类
{
[关键]
公共int类bid{get;set;}
公共虚拟ICollection SomeClassCs{get;set;}
}
公共类C类
{
[数据库生成(DatabaseGeneratedOption.Identity)]
公共int类cid{get;set;}
[Key,Column(Order=0),ForeignKey(“SomeA”)]
public int ClassAID{get;set;}//组合为主键的外键
[Key,Column(Order=1),ForeignKey(“SomeB”)]
公共int类bid{get;set;}
公共虚拟类a SomeA{get;set;}
公共虚拟类B SomeB{get;set;}
}
公共类D
{
[关键]
public int ClassDID{get;set;}
[外键(“SomeC”)]
公共int类cid{get;set;}
公共虚拟类c SomeC{get;set;}
}
创建迁移时,我收到以下错误:

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


有人解决了这个问题,或者我处理得不正确吗?

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

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

“我宁愿使用此外键,也不愿尝试映射合成 看起来有点奇怪的钥匙“

你说的是vs

我就是这么做的:

  • 在我的所有模型上使用标识(代理)键
  • 通过以下方式验证数据: 重写上下文类中的ValidateEntity-
  • 向自然键添加唯一索引-
  • 实体框架不提供数据注释属性来标识自然键或应该具有唯一索引的属性,但如果您查看我提供的链接中的答案,您将看到一些人为此创建自定义属性