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

时间:2014-04-10 13:23:18

标签: 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 : 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();
    }
}

当我想为MyClass创建复合主键时,会出现问题。我想要这样的主键:

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

问题是这是不允许的。 匿名类型不能具有多个具有相同名称的属性

我当然可以将Object1上的Id属性命名为Object1Id,将Object2上的Id属性命名为Object2Id,但我不想这样做。

我还可以在MyClass上添加另一个名为Id的属性,并将其用作主键,但也要避免使用它。

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

2 个答案:

答案 0 :(得分:4)

Mathew(https://stackoverflow.com/users/219933/mathew)给了我一些提示。

类需要看起来像这样(添加了Object1Id和Object2Id):

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);
    }
}

这并没有解决我的名为Id的重复键名列的问题,但我希望Entity Framework将来会支持这样的主键:

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

答案 1 :(得分:-1)

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

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