为什么我的关系没有加载?

时间:2015-01-24 17:26:57

标签: c# entity-framework

我有以下实体:

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

1 个答案:

答案 0 :(得分:3)

SingleElectricityMeter.Counter是(参考)导航属性。在您的代码中,它始终由

初始化
private Counter _counter = new Counter();

但是你shouldn't initialize reference properties。 EF会认为它们已加载,不会从数据库中加载它们。所以只需删除初始化。但要小心......

从OO的角度来看,在顶级类中添加读数的封装是一个好主意,但在实体框架(或任何ORM)的上下文中,它提出了一个警告。为了完成这项工作,您必须始终确保从数据库中读取Meter,包括Counter及其Readings

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

只要你这样做,EF就会跟踪它需要的所有对象,以便注意到Readings导致它应该存储在数据库中的更改。

此外,通过这样做,可以安全地访问Counter.CurrentReading。否则,这可能会触发延迟加载(可能不是很糟糕,但可能效率低下),或者如果在处理完上下文后发生这种情况,则会导致错误。