現在のEFバージョンには、オブジェクトの実体化を置き換えるフックはありません(ソースコードをダウンロードして自分で実装しようとしない限り)。つまり、EFは常に独自のステータスを作成し、それを実行できるようにするには、Status
クラスがそのルールに一致する必要もあります。なぜこれが必要なのかわかりませんが、ステータスに常に同じオブジェクトインスタンスが本当に必要な場合は、ハッキングできます。
Status
まず、EFのクラスを変更する必要があります。
public class Status{
// EF needs access to your property
public string StatusName { get; private set; }
// EF needs parameterless constructor because it will create instances
private Status() {}
private Status (string status) {
StatusName = status;
}
public static readonly Status Open = new Status("Open");
public static readonly Status Closed = new Status("Closed");
}
Status
次に、EFによって作成されたオリジナルを独自のものに置き換える必要があります。
public Context() : base() {
var objectContext = ((IObjectContextAdapter)this).ObjectContext;
objectContext.ObjectMaterialized += OnObjectMaterialized;
}
private void OnObjectMaterialized(object sender, ObjectMaterializedEventArgs args) {
var objectContext = (ObjectContext)sender;
var entity = args.Entity as Entity;
if (entity != null) {
switch (entity.Status.StatusName) {
case "Open":
entity.Status = Status.Open;
break;
case "Closed":
entity.Status = Status.Closed;
break;
}
// This is necessary because previous code made your object modified
objectContext.DetectChanges();
var entry = objectContext.ObjectStateManager.GetObjectStateEntry(entity);
entry.AcceptChanges();
}
}
これは醜いハックですが、本当にこれが必要な場合は、同様のことを行う必要があります。