我有以下实体:
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
中使用了继承吗?
使用外键我的数据库看起来不错:
修改 检索其他嵌套实体可以正常工作。
答案 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
。否则,这可能会触发延迟加载(可能不是很糟糕,但可能效率低下),或者如果在处理完上下文后发生这种情况,则会导致错误。