2

我有这两个实体,我在其中添加了给我一个错误的标记属性(错误是:无法确定类型之间关联的主要结束...

public class Lot
{
   [Key]
   public int Id { get; set; }

   public int Vehicle_Id { get; set; }

   [ForeignKey("Vehicle_Id")]
   public virtual Vehicle Vehicle { get; set; }
}

public class Vehicle
{
   public int Id { get; set; }
   public virtual Lot Lot { get; set; } // * This is the property that I added
}

车辆可能属于也可能不属于一个批次,但一个批次总是有 1 辆车。

我需要 Vehicle 类中这两个实体之间的反向导航属性,这样如果有一个与 Vehicle 关联的 Lot,那么我可以从 Vehicle 访问该 Lot。

这甚至可能吗?如果可以,我该怎么做而不会出现任何错误?

4

3 回答 3

2

使用以下映射:

modelBuilder.Entity<Lot>()
    .HasRequired(l => l.Vehicle) //  Lot will always have 1 Vehicle
    .WithOptional(v => v.Lot); // A Vehicle may or may not belong in a Lot
于 2013-07-19T12:46:49.373 回答
2

不,实体框架不支持这一点。Entity Framework 需要零对一/一对一关系的表来共享主键。您有单独的地段 ID 和车辆 ID,因此您能做的最好的就是将其映射为

public class Vehicle
{
  public int Id { get; set; }
  public virtual ICollection<Lot> Lots { get; set; }
}

然后访问vehicle.Lots.SingleOrDefault(). 这让 EF 将其视为一对多关系,但知道“多”永远不会超过一个。

于 2013-07-19T12:55:24.330 回答
1

我建议您手动编写映射,而不是使用流利的 api:

public class LotMapping : EntityTypeConfiguration<Lot>
{
    public LotMapping()
    {
        HasKey(e => e.Id);
        // This will make the foreign key in the `Vehicle` table
        HasRequired(e=>e.Vehicle).WithRequiredPrincipal(e=>e.Lot)

        // This will make the foreign key in the `Lot` table
        HasRequired(e=>e.Vehicle).WithRequiredDependent(e=>e.Lot)
        //....
    }
}

并将此方法添加到您的上下文中:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    {
        // Mappings Definitions
    modelBuilder.Configurations.Add(new LotMapping ());
    }

希望能帮助到你。

于 2013-07-19T12:46:07.150 回答