5

私はモデルを持っておりEnquiry、これは次の 2 つの状態のいずれかになります (他にもありますが、この目的のために 2 つだけを比較Newします) Closed。問い合わせの状態は、ユーザーが問い合わせに対して何ができるかによって異なります。たとえば、終了した問い合わせは削除できませんが、新しい問い合わせは削除できます (基本的な例)。

これを維持したいのですが、Entity Framework方法がわかりません。以下は私のコードです。

問い合わせ:

public class Enquiry
{
    public int Id { get; set; }
    public string CustomerAccountNumber { get; set; }

    public EnquiryState CurrentState { get; set; }
    public bool CanAddLines { get { return CurrentState.CanAddLines; } }
    public bool CanDelete { get { return CurrentState.CanDelete; } }

    public void ChangeState(EnquiryState currentState)
    {
        CurrentState = currentState;
    }

    public void CloseEnquiry()
    {
        CurrentState.CloseEnquiry();
    }

    /* More methods to change state here */

    public Enquiry()
    {
        CurrentState = new NewEnquiryState(this);
    }
}

お問い合わせの状態:

public abstract class EnquiryState
{
    internal readonly Enquiry CurrentEnquiry;

    protected EnquiryState(Enquiry currentEnquiry)
    {
        CurrentEnquiry = currentEnquiry;
    }

    public virtual bool CanDelete
    {
        get { return false; }
    }

    public virtual bool CanAddLines
    {
        get { return false; }
    }

    /* More properties here */

    public abstract void CloseEnquiry();

    /* More states here */
}

新しいお問い合わせの状態:

public class NewEnquiryState : EnquiryState
{
    public NewEnquiryState(Enquiry enquiry) : base(enquiry) { }

    public override bool CanDelete
    {
        get { return true; }
    }

    public override bool CanAddLines
    {
        get { return true; }
    }

    /* ... */

    public override void CloseEnquiry()
    {
        CurrentEnquiry.ChangeState(new CloseEnquiryState(CurrentEnquiry));
    }

    /* ... */
}

CloseEnquiryState:

public class CloseEnquiryState : EnquiryState
{
    public CloseEnquiryState(Enquiry enquiry) : base(enquiry) { }

    public override bool CanAddLines
    {
        get { return false; }
    }
    public override bool CanDelete
    {
        get { return false; }
    }

    /* ... */

    public override void CloseEnquiry()
    {
        throw new Exception("Closed Enquiry can't be closed");
    }
}

私の質問は、これらのさまざまな状態をデータベースに保存する方法がわかりません。int各状態で何らかのフィールドを使用Enquiryし、FK を介してそれらをマップする必要がありますか? CanAddLinesまた、フィールドとCanDeleteデータベースもマップする必要がありますか? ロジックがステート内に含まれているため、ステート パターン パラダイムにはまったく新しい

4

1 に答える 1