为什么在没有复合键的情况下需要使用列数据注释?

时间:2016-01-11 19:04:30

标签: c# ef-code-first foreign-keys multiple-columns composite-key

我有两个类,每个类都有一个主键(在DB中也经过验证 - 只有一个键,只有一个列是PK)。

public class Sub1
{
  [Key]public int Id {get; set;}
  [Required]public int Value {get; set;}
}

public class Sub2
{
  [Key]public int Id {get; set;}
  [Required]public int Value {get; set;}
}

然后我添加第三个类,它使用上面两个中的Id列作为外键。

public class Sup
{
  [Key]public int Id { get; set; }
  [ForeignKey(Sub1)]public int Sub1Id { get; set; }
  [ForeignKey(Sub2)]public int Sub2Id { get; set; }
  public virtual Sub1 { get; set; }
  public virtual Sub2 { get; set; }
}

当我尝试运行 Add-Migration 时,我收到以下错误。没有复合主键,也没有多个主键。当我添加 Column 属性时,它可以工作,但我觉得它不应该是必要的(因此,我怀疑我做错了什么)。

  

无法在Beep.Bapp.Thing类型上确定外键的复合外键排序。在复合外键属性上使用ForeignKey数据注释时,请确保使用Column data annotation或Fluent API指定顺序。

this answer中,有这里,我得到了htat,我们需要添加列订购信息。

public class Category
{
    [Key, Column(Order = 0)]
    public int CategoryId2 { get; set; }
    [Key, Column(Order = 1)]
    public int CategoryId3 { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Product> Products { get; set; }
}

public class Product
{
    [Key]
    public int ProductId { get; set; }
    public string Name { get; set; }
    [ForeignKey("Category"), Column(Order = 0)]
    public int CategoryId2 { get; set; }
    [ForeignKey("Category"), Column(Order = 1)]
    public int CategoryId3 { get; set; }

    public virtual Category Category { get; set; }
}

1 个答案:

答案 0 :(得分:0)

我根本不知道您的代码是如何编译的。试试这个型号:

public class Sub1
{
    [Key]
    public int Id {get; set;}
    [Required]
    public int Value {get; set;}
}

public class Sub2
{
    [Key]
    public int Id {get; set;}
    [Required]
    public int Value {get; set;}
}

public class Sup
{
    [Key]
    public int Id { get; set; }
    public int Sub1Id { get; set; }
    public int Sub2Id { get; set; }
    public virtual Sub1 Sub1 { get; set; }
    public virtual Sub2 Sub2 { get; set; }
}