2017-04-17 8 views
0

특히 Entity Framework에서 계층 적 상속 구조를 설정하려고합니다. 예를 들어 사용자 환경 설정이 있다고 가정 해 보겠습니다.Entity Framework 여러 수준 속성 매핑

public class StorePreference: Preference { } 

public class UserPreference : Preference { } 

public class Preference { 
public string BackgroundColor { get; set; } 
public ContactMethod ContactMethod { get; set; } 
} 

public enum ContactMethod { 
    SMS, 
    Email 
} 

사용자의 환경 설정을 조회 할 수 있도록하고 싶습니다. 사용자가 없거나 속성 값이 null 인 경우 상위 (저장소) 기본 환경 설정을 조회합니다. 나는 SQL 쿼리로 이것을 작성한다면

public class UserPreference : StorePreference { 
    private string _backgroundColor; 

    public string BackgroundColor { 
     get { 
      if (this._backgroundColor == null) 
       return base; 

      return this._backgroundColor; 
     } 
     set { this._backgroundColor = value; } 
    } 
} 

, 그것은 CROSS은 CASE 문으로 적용 것 :

이상적으로, 나는 그것이 추상적 인 상속과 비슷한 일을하고 싶습니다

SELECT 
    CASE WHEN User.BackgroundColor == null THEN Store.BackgroundColor ELSE User.BackgroundColor END BackgroundColor, 
    CASE WHEN User.ContactMethod == null THEN Store.ContactMethod ELSE User.ContactMethod END ContactMethod 
FROM UserPreference User 
CROSS APPLY StorePreference Store 
WHERE UserPreference.UserId = @UserId 

EF에서로드하는 방법이 있습니까? 당신의 기본 클래스 추가 기본 속성 값에서

답변

0

: 데이터베이스에서 설정하려면이 같은

public class Preference { 
    public string BackgroundColor { get; set; } = "Red"; 
    public ContactMethod ContactMethod { get; set; } = ContactMethod.SMS; 
} 

뭔가 :만큼 속성 공공만큼

public class StorePreference : Preference { } 

public class UserPreference : Preference { } 

public class Preference { 
    public Preference() { 
     BackgroundColor = DefaultPreference.BackgroundColor; 
     ContactMethod = DefaultPreference.ContactMethod; 
    } 

    public string BackgroundColor { get; set; } 
    public ContactMethod ContactMethod { get; set; } 

    public DefaultPreference DefaultPreference { get; set; } 
} 

public class DefaultPreference { 
    public string BackgroundColor { get; set; } 
    public ContactMethod ContactMethod { get; set; } 
} 
+0

이 코드는 기본값을 하드 코드합니다. 기본 데이터베이스를 변경할 수 있도록 데이터 베 이스에 있어야합니다. –

+0

Preference 기본값을 'DefaultPreference'처럼 자신의 개체로 설정 한 다음 생성자에서 기본값을 설정할 수 있습니까? –

+0

방금 ​​데이터베이스에서 원하면 별도로 사용해야하는 DefaultPreference 객체를 반영하도록 해답을 업데이트했습니다. –

0

, 엔티티는 문제가되지 않습니다 다른 테이블의 데이터를 기본값으로 사용합니다.

public class ChildTable : EntityBase { 
    private string _someCategory; 

    [Key] 
    [Column(name: "CHILD_ID")] 
    public override int Id { get; protected set; } 

    [Column(name: "SOME_CATEGORY")] 
    public string SomeCategory { 
     get { return _someCategory; } 
     set { _someCategory = value ?? ParentTable.SomeCategory; } 
    } 

    [ForeignKey("ParentTable")] 
    [Column(name: "PARENT_ID")] 
    public int ParentTableId { get; set; } 

    public virtual ParentTable ParentTable { get; set; } 
} 

는 달리 오스틴의 대답은 간단 할 것, 세터 로직을 더 세밀하게 제어해야 할 경우이 생성자 단지 대안입니다 : 당신이 세터를 사용하는 경우에는 데이터를 보유하는 개인 필드를 만들 필요가있다 구현하려면