我有这两个实体,我已经添加了标记的属性,它给了我一个错误(错误是:无法确定类型之间关联的主要结束... )
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与一个车辆关联,那么我可以从车辆访问该地段。
这是否可能,如果是这样,我该怎么做而没有任何错误?
答案 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 ());
}
希望它有所帮助。