C# 来自相同类型的两个对象的组合键
我有一个简单的C# 来自相同类型的两个对象的组合键,c#,mysql,entity-framework,C#,Mysql,Entity Framework,我有一个简单的Employee课程 class Employee { public string Id { get; set; } ... } 另一个类事务,包含两名员工: class Transaction { public virtual Employee Registrant { get; set; } public virtual Employee Recipient { get; set; } } 为什么我不能让事务有一个复合键,由两个员工的ID组成
Employee
课程
class Employee
{
public string Id { get; set; }
...
}
另一个类事务,包含两名员工:
class Transaction
{
public virtual Employee Registrant { get; set; }
public virtual Employee Recipient { get; set; }
}
为什么我不能让事务
有一个复合键,由两个员工的ID组成。我是这样做的:
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; }
}
modelBuilder.Entity().HasKey(t=>new{t.registent.Id,t.Recipient.Id})代码>
Visual Studio会告诉我:
重复的匿名类型属性名称“Id”
尝试如下定义您的事务模型:
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 });
modelBuilder.Entity().HasKey(t=>new{t.registent.Id,t.Recipient.Id});
以下是一个很好的资源,您可以参考它来解决未来的问题:
试着这样定义您的事务
模型:
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 });
modelBuilder.Entity().HasKey(t=>new{t.registent.Id,t.Recipient.Id});
以下是一个很好的资源,您可以参考它来解决未来的问题:
当您编写新的{t.registent.Id,t.Recipient.Id}编译器时,尝试使用字段Id和Id生成匿名类型,因为它使用属性registent.Id和Recipient.Id的名称。类型不能包含多个同名属性,并且编译器生成错误。要避免这种情况,应指示编译器使用其他名称:
modelBuilder.Entity<Transaction>().HasKey(t => new { RegistrantiId = t.Registrant.Id, RecipientId = t.Recipient.Id });
modelBuilder.Entity().HasKey(t=>new{registentiid=t.registent.Id,RecipientId=t.Recipient.Id});
当您编写新的{t.registent.Id,t.Recipient.Id}编译器时,尝试使用字段Id和Id生成匿名类型,因为他使用属性registent.Id和Recipient.Id的名称。类型不能包含多个同名属性,并且编译器生成错误。要避免这种情况,应指示编译器使用其他名称:
modelBuilder.Entity<Transaction>().HasKey(t => new { RegistrantiId = t.Registrant.Id, RecipientId = t.Recipient.Id });
modelBuilder.Entity().HasKey(t=>new{registentiid=t.registent.Id,RecipientId=t.Recipient.Id});
是。。。很难让类型(匿名或非匿名)包含两个同名字段。。。为什么不能有不同的名称,比如new{Id1=…,Id2=…}
?是的。。。很难让类型(匿名或非匿名)包含两个同名字段。。。为什么不能有不同的名称,比如new{Id1=…,Id2=…}
?如果我添加代理键并更新数据库,实体框架将创建。那么为什么我需要另外两个字段呢?这对我来说似乎是多余的。@transporter\u room\u 3您添加了什么代理密钥?我不明白这个评论。你还没有透露你想要的实体关系模型是什么,所以我不打算猜测它…不管我,这是正确的答案。我只是把自己弄糊涂了。如果我添加一个代理键并更新数据库,实体框架就会创建。那么为什么我需要另外两个字段呢?这对我来说似乎是多余的。@transporter\u room\u 3您添加了什么代理密钥?我不明白这个评论。你还没有透露你想要的实体关系模型是什么,所以我不打算猜测它…不管我,这是正确的答案。我只是把自己弄糊涂了。