列表中包含一个对象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; }
}
这是怎么回事?
这叫做relationship fixup
。
Station EndStation
和List<Edge> Edges
在同一关系的相反边。
当从Db (edge.EndStation = ...
线)物化对象时,EF计算出对面是您的"边缘",它已经在内存中拥有-因此它进行修复并填充,无论您喜欢与否。
你应该看看这里的答案,了解一些细节LazyLoadingEnabled设置在EF 5中似乎不起作用
正如@Slauma所提到的,我不认为有一种方法可以禁用它-我猜这只是合乎逻辑的填充(如果不需要从Db额外加载)。