来自两个相同类型的对象的复合键

时间:2015-06-06 20:40:10

标签: c# mysql entity-framework

我有一个简单的Employee

class Employee
{
    public string Id { get; set; }
    ...
}

另一个包含两名员工的班级Transaction

class Transaction
{
    public virtual Employee Registrant { get; set; }
    public virtual Employee Recipient { get; set; }
}

为什么我不能使Transaction有一个复合键,由两个员工的ID组成。我这样做:

modelBuilder.Entity<Transaction>().HasKey(t => new { t.Registrant.Id, t.Recipient.Id });

和Visual Studio会告诉我:

  

复制匿名类型的属性名称&#39; Id&#39;

2 个答案:

答案 0 :(得分:3)

当您编写新的{t.Registrant.Id,t.Recipient.Id}编译器时,尝试使用字段Id和Id生成匿名类型,因为他使用属性Registrant.Id和Recipient.Id的名称。类型不能包含多个具有相同名称的属性,编译器会生成错误。为避免这种情况,您应该指示编译器使用其他名称:

modelBuilder.Entity<Transaction>().HasKey(t => new { RegistrantiId = t.Registrant.Id, RecipientId = t.Recipient.Id });

答案 1 :(得分:1)

尝试像这样定义Transaction模型:

class Transaction
{
    [Key]
    [Column(Order = 1)]
    public string RegistrantId { get; set; }

    [Key]
    [Column(Order = 2)]
    public string RecipientId { get; set; }

    [ForeignKey(Name = "RegistrantId")]
    public virtual Employee Registrant { get; set; }

    [ForeignKey(Name = "RecipientId")]
    public virtual Employee Recipient { get; set; }
}

EF非常善于猜测在异常情况下该做什么。在这种情况下,为两个ID添加显式属性应该有助于它到达SQL的正确映射。

你可能不需要我添加的所有属性,但通过将它们放在那里来明确是不会有害。

你不应该再这样了:

modelBuilder.Entity<Transaction>().HasKey(t => new { t.Registrant.Id, t.Recipient.Id });

这是一个很好的资源,你可以参考未来的问题:

Entity Framework Code First Data Annotations