2015-01-24 4 views
1

У меня есть следующие объекты:Почему мои отношения не загружены?

public abstract class Meter 
{ 
    public int MeterId { get; set; } 
    public string EANNumber { get; set; } 
    public string MeterNumber { get; set; } 
    public abstract void AddReading(CounterReading reading); 
} 

public abstract class ElectricityMeter : Meter { } 

public class SingleElectricityMeter : ElectricityMeter 
{ 
    private Counter _counter = new Counter(); 
    public virtual Counter Counter 
    { 
     get { return _counter; } 
     set { _counter = value; } 
    } 

    public override void AddReading(CounterReading reading) 
    { 
     Counter.Readings.Add(reading); 
    } 
} 

public class Counter 
{ 
    public int CounterId { get; set; } 

    private ObservableCollection<CounterReading> _readings = new ObservableCollection<CounterReading>(); 

    public virtual ObservableCollection<CounterReading> Readings 
    { 
     get { return _readings; } 
     set { _readings = value; } 
    } 


    [NotMapped] 
    public CounterReading CurrentReading 
    { 
     get 
     { 
      return Readings.MaxBy(m => m.Reading); 
     } 
    } 
} 

Когда я установил Counter отношения во время выполнения, все работает отлично. Когда я пытаюсь загрузить сохраненные данные, мой объект Counter не загружен (это по умолчанию Counter, а не тот, у кого есть данные из моей базы данных).

Это все еще потому, что я использую наследование в моем Meter? Моя база данных выглядит достаточно прилично с внешними ключами: enter image description here

Редактировать Получение других вложенных объектов работает без проблем. enter image description here

+0

Вы пробовали это, не используя наследование в вашем ElectricityMeter? Кроме того, почему вы используете ObservableCollection вместо простой коллекции? – danludwig

+0

@danludwig Я еще не пробовал это без наследования, но я надеюсь, что результат останется таким же, потому что использование наследования облегчает мою запись для этого приложения. Я использую ObservableCollection, потому что таким образом я могу позволить обновлению пользовательского интерфейса без написания кода самостоятельно. –

+0

Можете ли вы показать нам код, который извлекает SingleElectricityMeter из базы данных? – Dabblernl

ответ

3

SingleElectricityMeter.Counter - (справочная) навигационная система. В вашем коде всегда инициализируется

private Counter _counter = new Counter(); 

Но вы shouldn't initialize reference properties. EF будет думать, что они загружены и не будут загружать их из базы данных. Поэтому просто удалите инициализацию. Но будьте осторожны ...

Инкапсуляция добавления чтений в классе верхнего уровня является хорошей идеей с точки зрения OO, но в контексте Entity Framework (или любого ORM) она поставляется с оговоркой. Для того, чтобы сделать эту работу, вы всегда должны убедиться, что Meter считывается из базы данных, включая Counter и ее Readings:

db.Meters.Include(m => m.Counter.Readings) 

До тех пор, как вы сделаете это, EF будет отслеживать все объекты, необходимые для того, что Readings вызывает изменения, которые он должен хранить в базе данных.

Кроме того, при этом можно получить доступ к Counter.CurrentReading. В противном случае это может привести к ленивой загрузке (может быть, не плохо, но может быть неэффективно) или вызвать ошибку, если это произойдет после того, как контекст был удален.

+0

Если я не должен инициализировать свойства ссылки, как я буду использовать их, когда я только что создал новый счетчик, и, таким образом, счетчик по-прежнему равен нулю? –

+0

Вам также придется создать новый счетчик. Я не вижу другой альтернативы. –

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