2013-05-17 2 views
0

У меня проблема, когда объект, содержащий свойство списка, содержит 1 элемент, который он не должен (он должен быть пустым).Список содержит один объект, почему?

Класс Station содержит список ребер (края списка). Класс Edge имеет EndStation, который имеет тип Station.

Проблема заключается в том, что после возвращения IQueryable из GetEdgesByStartStation() EndStation на каждом Edge содержит список ребер (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 EndStation и List<Edge> Edges находятся на противоположных сторонах тех же отношений.
Когда материализует объект из Db (линия edge.EndStation = ...), EF определяет, что противоположная сторона - это ваш «край», который он уже имеет в памяти, - так что он фиксирует и заполняет это, нравится вам это или нет ,

Вы должны взглянуть на этот ответ здесь некоторые детали LazyLoadingEnabled setting doesn't seem to work in EF 5

Как @Slauma упоминалось, я не думаю, что есть способ отключить, что - я предполагаю, что это просто логично иметь и заполненными (если дополнительная загрузка с Db не требуется).

+0

Итак, мой единственный способ удалить Edge из списка - это вручную перезаписать или очистить список объектов? – KLIM8D

+1

@NSGaga: Вы можете удалить свой комментарий по этому вопросу сейчас. Особенно Джордж Штокер будет счастлив :) http://meta.stackexchange.com/questions/180325/help-us-figure-out-a-way-to-handle-the-explosion-of-comments-on-stack- overflow – Slauma

+1

@ KLIM8D Я не думаю, что вы должны попытаться вручную очистить его (и это также эффективно повлияет на вашу другую сторону, чего вы не хотите). Этот список является логическим следствием того, как настроены ваши отношения. Может быть, вам действительно нужно и хотите, чтобы ваши отношения немного по-другому, например, если у вас есть «стандартная» или основная станция, и список ребер отдельно - вы должны думать об этом, я думаю, – NSGaga

Смежные вопросы