列表中包含一个对象why

本文关键字:why 一个对象 包含 列表 | 更新日期: 2023-09-27 18:14:18

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

Station类包含一个边的列表(list edges)。Edge类有一个终端站,它的类型是Station。

问题是,在从GetEdgesByStartStation()返回IQueryable之后,每个Edge上的EndStation包含一个Edge列表(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;
}

我想要这段代码做的是,获取传递给方法的车站的所有边。对于每条边,连接一个带有空边列表的终端站。

站类:

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; }
}

这是怎么回事?

列表中包含一个对象why

这叫做relationship fixup

Station EndStationList<Edge> Edges在同一关系的相反边。
当从Db (edge.EndStation = ...线)物化对象时,EF计算出对面是您的"边缘",它已经在内存中拥有-因此它进行修复并填充,无论您喜欢与否。

你应该看看这里的答案,了解一些细节LazyLoadingEnabled设置在EF 5中似乎不起作用

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