2013-05-17 56 views
0

我有一個問題,其中包含一個列表屬性的對象擁有1項,它不應該(它應該是空的)。列表中包含一個對象爲什麼?

該站類包含邊緣(名單邊緣)的列表。 Edge類具有EndStation類型的Station。

問題是,在從GetEdgesByStartStation()返回IQueryable後,每個Edge上的EndStation都包含一個非空(它應該)空邊的列表(List Edges)。 列表中的項目是它自己的站(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; 
} 

我想這個代碼做的,是讓所有的邊緣爲站傳遞給方法。對於每個邊緣,連接一個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; } 

} 

怎麼能這樣呢?

+1

您需要提供更多信息。首先,如果在問題中添加完全可編譯和可執行的代碼示例,那將是最好的。如果你不能這樣做(例如,你可能需要一個數據庫),至少要提供問題中的所有代碼*。我的意思是你應該從github項目中添加類,並將它們修剪成與這個問題相關的東西。接下來,你說「它不應該」。問題是,它應該包含什麼?零?許多? –

+0

爲什麼它不應該保存一個項目?這個錯誤,如果有的話,可能與發佈的代碼無關。 – JeffRSon

+0

或者它可能在數據庫關係中。 – JeffRSon

回答

2

這就是所謂的relationship fixup

Station EndStationList<Edge> Edges在相同的關係的相對側上。
當從DB(該edge.EndStation = ...線)的EF計算出的對面是你的「邊緣」,它已經在內存物化的對象 - 它確實是這樣的修正和填補在,不管你喜歡還是不喜歡。

你應該看看這個答案這裏的一些細節LazyLoadingEnabled setting doesn't seem to work in EF 5

正如@Slauma提到的,我不認爲這是禁止該的方式 - 我猜這只是邏輯有兩個填充(如果不需要來自Db的額外負載)。

+0

好的,所以我唯一的選擇是從列表中刪除邊緣是手動覆蓋還是清除對象列表? – KLIM8D

+1

@NSGaga:你現在可以在這個問題下刪除你的評論。特別是George Stocker會很開心:) http://meta.stackexchange.com/questions/180325/help-us-figure-out-a-way-to-handle-the-explosion-of-comments-on-stack-溢出 – Slauma

+1

@ KLIM8D我不認爲你應該嘗試手動清除它(並且這也會有效地影響你的另一面,而你不想)。該清單是您關係如何建立的邏輯結果。也許你真的需要和想要你的關係有點不同,比如有一個'默認'或主站 - 分開的邊緣列表 - 你應該考慮一下,我猜 – NSGaga

相關問題