2015-01-24 8 views
2

나는 다음과 같은 기관을하십시오 GasMeterPremise 사이 1 관계 :탐색 속성은 어떻게 작동합니까?

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

public class GasMeter : Meter 
{ 
    public virtual Counter Counter { get; private set; } 

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

public class Premise 
{ 
    [Key] 
    public int PremiseId { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 

    [Required] 
    public virtual Address Address { get; set; } 
    public string Type { get; set; } 

    public virtual GasMeter GasMeter { get; set; } 
} 

나는 일이있다.

myPremise.GasMeter = myMeter을 설정하고 myMeter.Premise으로 나중에 코드에서 myPremise을 검색하려면 어떻게해야합니까? 유창 API를 통해 그것을 설정하는 경우

편집 은 다음과 같이 실행할 때 나는 다음과 같은 예외가

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Premise>().HasOptional(p => p.GasMeter) 
      .WithRequired(m => m.Premise); 
    } 

: 유형의

예외 '를 System.Data.Entity .ModelConfiguration.ModelValidationException '이 EntityFramework.dll에서 발생했지만 사용자 코드에서 처리되지 않았습니다.

추가 정보 모델 생성 중에 하나 이상의 유효성 검사 오류가 감지되었습니다.

전제 : FromRole : NavigationProperty '전제 조건'이 유효하지 않습니다. AssociationType 'Premise_GasMeter'의 FromRole 'Premise_GasMeter_Target'의 'GasMeter'유형은이 NavigationProperty가 선언 된 'Meter'유형과 정확히 일치해야합니다.

그렇다면 상속 기능을 사용하여 탐색 속성을 사용할 수 없다는 의미입니까? 그러면 문제는 어떻게 해결됩니까?

+0

참조 : http://stackoverflow.com/a/27727545/861716 –

+0

@GertArnold 내 업데이트를 참조하십시오. –

+1

'public 가상 전제 전제 {get; 세트; }''가''공공 가상 계량기 '가되어야한다. –

답변

0

난 당신이 PK에 대한 각 클래스/FK 관계에 ID를 추가 할 필요가 있다고 생각

public abstract class Meter 
{ 
    .... 
    public int PremiseId 
    public virtual Premise Premise { get; set; } 
} 

public class Premise 
{ 
    .... 
    public int GasMeterId 
    public virtual GasMeter GasMeter{ get; set; } 
} 
+0

제 전제를 측량기에 추가 한 후에도 측량기에 계측기가 표시되지 않습니다. 당신의 제안에도. –

0

당신은 아마 내 가상 속성이 두 개체를 연결 할 필요가 없습니다 서로. 이 전제 테이블의 기본 키는 다음

var aPremise = new Premise(); 
var aMeter = new GasMeter(); 
aPremise.GasMeter = aMeter; 
aMeter.PremiseId = aPremise.PremiseId; 

를 얻을이 GasMeter에 매핑 전제

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

SET를 얻을 수 Select(x => x.PremiseId == aMeter.PremiseId).SingleOrDefault()를 사용하여 전제 개체를 얻을이기 때문에 PremiseId을 유지 미터 클래스를 수정 시도

var thePremise = _repository.Set<Premise>.Select(x => x.PremiseId == aMeter.PremiseId).SingleOrDefault(); 
+1

이렇게 사용하면 탐색 속성이 없어집니다. –