是否可以在实体框架中具有反向导航属性?

时间:2013-07-19 12:33:27

标签: entity-framework

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

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类的这两个实体之间的反向导航属性,这样如果有一个Lot与一个车辆关联,那么我可以从车辆访问该地段。

这是否可能,如果是这样,我该怎么做而没有任何错误?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

不,实体框架不支持此功能。实体框架要求表以零对一/一对一的关系共享主键。您有单独的批次ID和车辆ID,因此您可以做的最好是将其映射为

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

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

答案 2 :(得分: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)
        //....
    }
}

并向您的Context添加此方法:

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

希望它有所帮助。