Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 来自相同类型的两个对象的组合键_C#_Mysql_Entity Framework - Fatal编程技术网

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您添加了什么代理密钥?我不明白这个评论。你还没有透露你想要的实体关系模型是什么,所以我不打算猜测它…不管我,这是正确的答案。我只是把自己弄糊涂了。