3

私はこのクラスを持っています

public class Status
{
    private string status;
    public string StatusName
    {
        get
        {
            return status;
        }
    }
    private Status (string _status)
    {
        status = _status;
    }
    public static readonly Status Open = new Status("Open");
    public static readonly Status Closed = new Status("Closed");
}  

コードファーストを使用して、新しいオブジェクトを作成する代わりに、事前定義されたオブジェクト(Open、Closed)の1つをロードするようにEFを構成できますか?
または、同様の動作を実現するためのより良い方法はありますか?

4

1 に答える 1

1

現在の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();
    }
}

これは醜いハックですが、本当にこれが必要な場合は、同様のことを行う必要があります。

于 2013-01-28T19:40:51.723 に答える