2016-10-24 9 views
-1

新しいレコードを保存し、既存のレコードを単一のフォーム を使用して更新するが、2つのコンストラクターを使用します。呼び出されるコンストラクターは、呼び出すメソッドを決定する必要があります(保存または更新)。特定のコンストラクターに基づいて特定のメソッドを呼び出す

public ManageRecord(Record record){ //update record  } 

public ManageRecord(){ //save new record  } 

private void Save_Click(object sender, RoutedEventArgs e){ 
    //if default constructor invokes form call save method 
    SaveMethod(); 
    //if constructor with parameters invokes form call update method 
    UpdateMethod(record); 
} 

これはどのように達成できますか?

+0

なぜこれに関係するコンストラクタを取得することを選択しましたか? –

+1

私はXY問題をここで感知しています。これで本当に何を達成しようとしていますか?あなたの根本的な問題を教えてください。正しい解決方法を教えてください。 –

+0

私はこれがView Modelにあると推測します*。新しいレコードを挿入する必要があるかどうかを知っているか、モデルのインスタンスに基づいて既存のレコードを更新するかどうかを試みています。それが正しい場合は、私たちに知らせてください。 –

答えて

1

これを解決するために過去に行ったことは、モデルに[プライマリキー]フィールドをNullableフィールドとして持つことです。レコードを保存しようとすると、モデルのフィールドを見ることができます。MyPk.HasValuetrueを返した場合は、レコードを更新しています。falseの場合は、新しいレコードを挿入しています。

モデルのインスタンスを取得するコンストラクタを呼び出すときは、ローカルフィールドに保存するだけです。モデルのないコンストラクタが呼び出されると、null PKを持つ新しいモデルインスタンスを作成し、それをローカルフィールドに保存します。 Saveはローカルフィールドを調べるだけです。

最終的に、あなたのアクションは、どのコンストラクタが呼び出されたかに直接基づいているわけではなく、現在作業しているモデルの状態に基づいている必要があります。

+0

サイドノート:このケースでは、(SaveOrUpdate()のような)ちょうど1つのメソッドを呼び出すことができます。 –

+0

私はコンストラクタによって渡されたレコードのIDをチェックしていました。あらかじめ確立された – wsduho

+0

があることを期待しています。私はコンストラクタによって渡されたレコードのIDをチェックすることを考えました。私は、同じ結果を達成するための事前設定された、またはより良い方法があると願っていました。 – wsduho

0

コンストラクタでブール値を設定するだけで済みます。

private readonly bool _isNewEntity; 

public ManageRecord() 
{ 
    _isNewEntity = true; 
    // Same as existing, _record = new Record() ? 
} 

public ManageRecord(Record record) 
{ 
    _isNewEntity = false; 
    // Same as existing, _record = record ? 
} 

private void Save_Click(object sender, RoutedEventArgs e) 
{ 
    if (_isNewEntity) 
     SaveMethod(); 
    else 
     UpdateMethod(record); 
} 
関連する問題