2015-10-18 38 views
1

我有以下型号EF6流利的API地图相关实体在自定义按键/属性不PK

public class Rate 
{ 
    public Guid Id { get; set; } // PK 
    public int SpecialId { get; set; } 

    [Column(TypeName = "Money")] 
    public decimal Rental { get; set; } 
    public virtual Vehicle Vehicle { get; set; } 
} 

而下面......

public class Vehicle 
{ 
    public Guid Id { get; set; } // PK 
    public int SpecialId { get; set; } 

    public string Manufacturer { get; set; } 
    public string Model { get; set; } 

    // List of rates on 
    public virtual ICollection<Rate> Rates { get; set; } 
} 

所以速度将有车辆和车辆可以有一个价目表。通常我只是使用PK和EF的地图很好。

但是在这种情况下,我需要使用SpecialId映射/连接它们。我从Rate Mapping类开始,但只能映射连接的一侧。我如何告诉它不要使用PK ID,而是双方使用SpecialId?

HasKey(x => x.Id); 
Property(x => x.Id).IsRequired(); 
Property(x => x.SpecialId).IsRequired(); 
HasOptional(x => x.Vehicle).WithMany(x => x.Rates).Map(m => m.MapKey("SpecialId")); 

有没有一种方法可以在速率和车辆表上使用SpecialId来加入两者。也许在该.Map()方法上的另一个重载?

+0

在我看来,如果没有完全知道你的域名,那些id应该去。两者似乎都是PK级的属性。也许有一种方法可以在映射时转换为PK? –

+0

@MikaelEliasson需要使用特殊ID将费率与车辆绑定在一起。 'Id'就是这样,每个记录都有一个唯一的ID,所以我可以在需要的时候将其单独删除并单独删除。我不明白我会如何输球?我正在EF中查找复合键,但我认为这不正确? – leen3o

+0

但是车辆上的SpecialId是独一无二的还是两辆车有相同的SpecialId? –

回答

2

我认为您需要的东西在EF 6.x和以前的版本中不受支持,但在EF 7中,它被称为Alternate Key。在你的情况下,这将是:

Entity<Rate>().Reference(r=>r.Vehicle) 
       .InverseCollection(v=>v.Rates) 
       .ForeignKey(r=>r.SpecialId) 
       .PrincipalForeignKey(v=>v.SpecialId); 
+0

我认为这是正确的。但是,查询你并不需要映射关系。无论如何,你可以使用连接来查询它。如果您需要外键约束,则可以在迁移或类似操作中手动添加。 –

相关问题