2015-01-24 6 views
1

나는 다음과 같은 요소를 가지고 : 나는 런타임에서 Counter 관계를 설정왜 내 관계가로드되지 않습니까?

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입니다.

Meter에서 상속을 사용하고 있기 때문에 여전히이 상태입니까? 내 데이터베이스는 외래 키와 충분히 괜찮은 보인다 : 다른 중첩 된 개체를 가져 enter image description here

편집 가 문제없이 작동합니다. enter image description here

+0

전기 계량기에서 상속을 사용하지 않고 사용해 보셨습니까? 또한 일반 컬렉션 대신 ObservableCollection을 사용하는 이유는 무엇입니까? – danludwig

+0

@danludwig 상속을 사용하지 않고 아직 시도하지 않았지만 상속을 사용하면 내 인생을이 애플리케이션을보다 쉽게 ​​작성하므로 결과가 동일하게 유지되기를 바랍니다. ObservableCollection을 사용하기 때문에 UI를 업데이트하지 않고 코드를 직접 작성할 수 있습니다. –

+0

데이터베이스에서 SingleElectricityMeter를 검색하는 코드를 표시 할 수 있습니까? – Dabblernl

답변

3

SingleElectricityMeter.Counter은 (참조) 탐색 속성입니다. 귀하의 코드에서 그것은 항상

에 의해 초기화됩니다
private Counter _counter = new Counter(); 

하지만 당신은 shouldn't initialize reference properties. EF는로드 된 것으로 간주하여 데이터베이스에서로드하지 않습니다. 따라서 초기화를 제거하십시오. 하지만 조심 ...

최상위 클래스에서 판독 값을 추가하는 캡슐화는 OO 관점에서 좋은 아이디어이지만 Entity Framework (또는 모든 ORM)의 컨텍스트에서는주의해야합니다. , EF 그것을 위해 필요로하는 모든 객체를 추적한다만큼 당신이 이렇게 같이

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

:이 작업을하기 위해 당신은 항상 MeterCounterReadings를 포함하여 데이터베이스에서 읽도록 확인해야 Readings이 데이터베이스에 저장해야하는 변경 사항을 확인합니다.

또한 그렇게함으로써 Counter.CurrentReading에 액세스하는 것이 안전합니다. 그렇지 않으면 컨텍스트가 삭제 된 후에 지연로드가 발생하거나 (좋지는 않지만 비효율적 일 수 있음) 또는 오류가 발생할 수 있습니다.

+0

참조 등록 정보를 초기화하지 않아야한다면 방금 새 측정기를 만들었으므로 카운터가 여전히 null입니까? –

+0

그러면 새 카운터도 만들어야합니다. 나는 다른 대안을 보지 못한다. –

관련 문제