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で読み込む方法はありますか?お使いのベースクラスで
これはデフォルトのハードコードです。私はそれらをデータベースに入れて、デフォルトを変更できるようにします –
あなたはPreferenceのデフォルトを 'DefaultPreference'のような独自のオブジェクトにしてから、コンストラクタのデフォルトを設定できますか? –
データベースから取得する必要がある場合は、分離する必要があるDefaultPreferenceオブジェクトを反映するように答えを更新しました。 –