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