我有一个简单的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;
答案 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 });
这是一个很好的资源,你可以参考未来的问题: