C# 实体框架6和复合主键,名称重复

C# 实体框架6和复合主键,名称重复,c#,entity-framework-6,C#,Entity Framework 6,我有一节课看起来像这样 public class MyClass { public Object1 Object1 { get; set; } public Object2 Object2 { get; set; } public int Order { get; set; } public DateTime Created { get; set; } } MyClass是一个带有两个附加列的连接表 实体映射: public class MyClassMap :

我有一节课看起来像这样

public class MyClass
{
    public Object1 Object1 { get; set; }
    public Object2 Object2 { get; set; }
    public int Order { get; set; }
    public DateTime Created { get; set; }
}
MyClass是一个带有两个附加列的连接表

实体映射:

public class MyClassMap : EntityTypeConfiguration<MyClass>
{
    public MyClassMap()
    {
        ToTable("dbo.MyClass");

        HasKey(pc => new { pc.Object1.Id, pc.Object2.Id });

        Property(x => x.Order).IsOptional();
        Property(x => x.Created).HasColumnType("DateTime").IsRequired();
    }
}
问题是这是不允许的。 匿名类型不能有多个同名属性

我当然可以将Object1类上的Id属性命名为Object1Id,将Object2类上的Id属性命名为Object2Id,但我不希望这样

我还可以在MyClass上添加另一个名为Id的属性,并将其用作主键,但我也希望避免这样做


有没有其他方法可以解决这个问题?

那么为什么不给匿名类型属性命名呢

HasKey(pc => new { Id1 = pc.Object1.Id, Id2 = pc.Object2.Id });
马修()给了我一些提示

类需要如下所示(添加了Object1Id和Object2Id):

实体映射:

public class MyClassMap : EntityTypeConfiguration<MyClass>
{
    public MyClassMap ()
    {
        this.ToTable("dbo.MyClass");

        HasKey(pc => new { pc.Object1Id, pc.Object2Id});

        HasRequired(x => x.Object1).WithMany().HasForeignKey(x => x.Object1Id);
        HasRequired(x => x.Object2).WithMany().HasForeignKey(x => x.Object2Id);
    }
}

您将获得System.InvalidOperationException。表达式应该表示一个属性:C#::“t=>t.MyProperty”VB.Net:“Function(t)t.MyProperty”。当指定多个属性时,请使用匿名类型:C#:'t=>new{t.MyProperty1,t.MyProperty2}'VB.Net:'Function(t)new With{t.MyProperty1,t.MyProperty2}'那么,什么是pc,您可以显示此代码行的上下文,或者更好的是,显示再现错误的可编译示例吗?键应该位于同一个表中,因此,您应该在
MyClass
中添加与
Object1
Object2
的主键对应的属性,并将它们标记为外键,然后在
HasKey
中使用它们。对于您当前的代码,就像说
MyTable
有一个复合键,它们位于两个表this和that中。这是一个多对多关系,如产品(Object1)、供应商(Object2)和产品供应商(MyClass)。由于该关系中存在非键属性,因此无法对多对多关系进行建模,但从某种意义上说,
产品
可以通过多个
采购订单
s订购,每个
供应商
可以收到多个
采购订单
s。
public class MyClass
{
    public Object1 Object1 { get; set; }
    public int Object1Id { get; set; }
    public Object2 Object2 { get; set; }
    public int ObjectId2 { get; set; }
    public int Order { get; set; }
    public DateTime Created { get; set; }
}
public class MyClassMap : EntityTypeConfiguration<MyClass>
{
    public MyClassMap ()
    {
        this.ToTable("dbo.MyClass");

        HasKey(pc => new { pc.Object1Id, pc.Object2Id});

        HasRequired(x => x.Object1).WithMany().HasForeignKey(x => x.Object1Id);
        HasRequired(x => x.Object2).WithMany().HasForeignKey(x => x.Object2Id);
    }
}
    HasKey(pc => new { pc.Object1.Id, pc.Object2.Id});