实体框架多对象关系

本文关键字:关系 多对象 框架 实体 | 更新日期: 2023-09-27 18:13:46

我有一个表,有2个外键到同一个父表,Edge。StartStationId和Edge.EndStationId.

我试图将这些映射到实体框架中的对象,但找不到解决问题的方法。我找到了一些解决方案,在父(站)上使用2个集合,这是我不感兴趣的。

站(父)类:

public partial class Station
{
    public Station()
    {
        this.Reservations = new List<Reservation>();
        this.StationMaintenances = new List<StationMaintenance>();
    }
    public int ID { get; set; } 
    public int TypeId { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public decimal StationLat { get; set; }
    public decimal StationLong { get; set; }
    public bool IsOperational { get; set; }
    public bool IsActive { get; set; }
    public DateTime CreatedDate { get; set; }
    public virtual BatteryStorage BatteryStorages { get; set; }
    public virtual List<Reservation> Reservations { get; set; }
    public virtual List<StationMaintenance> StationMaintenances { get; set; }
    public virtual List<Edge> Edges { get; set; }
    public virtual StationType StationType { get; set; }
}

Edge (child) class:

public partial class Edge
{
    public int ID { get; set; }
    public int StartStationId { get; set; }
    public virtual Station StartStation { get; set; }
    public int EndStationId { get; set; }
    public virtual Station EndStation { get; set; }
    public decimal Distance { get; set; }
    public decimal Time { get; set; }
    public bool IsActive { get; set; }
}

在OnModelCreating中添加的边缘映射类。

public EdgeMap()
{
    // Primary Key
    this.HasKey(t => t.ID);
    // Properties
    // Table & Column Mappings
    this.ToTable("Edges");
    this.Property(t => t.ID).HasColumnName("ID");
    this.Property(t => t.StartStationId).HasColumnName("StartStationId");
    this.Property(t => t.EndStationId).HasColumnName("EndStationId");
    this.Property(t => t.Distance).HasColumnName("Distance");
    this.Property(t => t.Time).HasColumnName("Time");
    this.Property(t => t.IsActive).HasColumnName("IsActive");
    // Relationships
    //this.HasOptional(t => t.StartStation)
    //    .WithMany(t => t.Edges)
    //    .HasForeignKey(d => d.StarStationId);
    //this.HasOptional(t => t.EndStation)
    //    .WithMany(t => t.Edges)
    //    .HasForeignKey(d => d.EndStationId);
}
异常:

在模型生成过程中检测到一个或多个验证错误:System.Data.Entity.Edm.EdmAssociationType::多重性与角色'Edge_EndStation_Target'中关系'Edge_EndStation'中的引用约束冲突。因为从属角色中的所有属性都是非空的,所以主角色的多重性必须为"1"。

实体框架多对象关系

我认为你发布的特定错误是抱怨HasOptional。因为外键(StartStationIdEndStationId)是不可空的,所以它需要一个必需的映射。尝试将其更改为HasRequired,或将StartStationIdEndStationId的类型更改为int?,以便它知道导航属性可以为空。

对于Edges集合,它应该包含什么?任何Edge引用StationStartStationIdEndStationId值?如果是这样的话,我不认为你可以用一个集合做到这一点。