2017-04-17 11 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 
} 

私はユーザーの設定を参照するとよいでしょう。ユーザーが存在しないか、プロパティー値がヌルの場合、親(ストア)のデフォルト設定を検索します。

理想的には、私はそれが抽象的継承に似た働きたいのですが:

public class UserPreference : StorePreference { 
    private string _backgroundColor; 

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

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

私はSQLクエリとしてこれを書くとしたら、それはCASE文では適用されCROSSだろう:

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; } 
} 

あなたがそうでなければオースティンの答えは単純になり、セッターのロジックをより詳細に制御する必要がある場合は、コンストラクタにちょうど代わるものです:あなたがセッターを使用した場合は、データを保持するためにプライベートフィールドを作成する必要があります実装する

関連する問題