繁体   English   中英

列表包含一个对象为什么?

[英]List contains one object why?

我有一个问题,其中包含list属性的对象包含1项,它不应该(它应该为空)。

Station类包含边列表(List Edges)。 Edge类有一个EndStation,它是Station类型。

问题是,在从GetEdgesByStartStation()返回IQueryable后,每个Edge上的EndStation包含一个边缘列表(List Edges),它不是空的(应该如此)。 列表中的项目是它自己的Station(edge.EndStation)。 我试图在下面的代码中用注释来说明它

public IQueryable<Edge> GetEdgesByStartStation(Station station)
{
    var edges = db.Edges.Where(x => x.StartStationId.Equals(station.ID));
    foreach (var edge in edges)
    {
        edge.EndStation = db.Stations.FirstOrDefault(x => x.ID.Equals(edge.EndStationId)); 
        //Here the edge.EndStation.Edges would contain 1 item, edge.EndStation 
        //eg. edge.EndStation = "Miami", edge.EndStation.Edges = { "Miami" }
    }

    return edges;
}

我想要这个代码做的是获得传递给方法的Station的所有边缘。 对于每条边,将EndStation连接到空的边列表。

车站类:

public partial class Station
{
    public Station()
    {
        this.Reservations = new List<Reservation>();
        this.StationMaintenances = new List<StationMaintenance>();
    }

    [DataMember]
    //[JsonConverter(typeof(Int32))] 
    public int ID { get; set; }
    [DataMember]
    //[JsonConverter(typeof(Int32))] 
    public int TypeId { get; set; }
    [DataMember]
    public string Title { get; set; }
    [DataMember]
    public string Description { get; set; }
    [DataMember]
    public decimal StationLat { get; set; }
    [DataMember]
    public decimal StationLong { get; set; }
    [DataMember]
    public bool IsOperational { get; set; }
    [DataMember]
    public bool IsActive { get; set; }
    [DataMember]
    public DateTime CreatedDate { get; set; }
    [DataMember]
    public virtual BatteryStorage BatteryStorages { get; set; }
    [DataMember]
    public virtual List<Reservation> Reservations { get; set; }
    [DataMember]
    public virtual List<StationMaintenance> StationMaintenances { get; set; }
    [DataMember]
    public virtual List<Edge> Edges { get; set; }
    [DataMember]
    public virtual StationType StationType { get; set; }
}

边缘类:

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

}

怎么会这样?

这就是所谓的relationship fixup

Station EndStationList<Edge> Edges位于相同关系的两侧。
当从Db( edge.EndStation = ...行)实现对象时,EF会发现对面是你在内存中已经存在的“边缘” - 所以它会进行修正并将其填入,无论你是喜不喜欢。

您应该在这里查看这个答案以获取一些细节LazyLoadingEnabled设置似乎在EF 5中不起作用

正如@Slauma提到的那样,我认为没有一种方法可以禁用它 - 我猜这两种方法都是合乎逻辑的(如果不需要额外的Db加载)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM