2010-12-30 7 views
1

私は、Addressのコレクションを持つCompanyクラスを持っています。挿入/更新前のオブジェクトを置き換えるNHibernateリスナ/イベント

ここに私のアドレスのクラスです。(私の頭の書かれたトップ):

public class Address 
{ 
    public string Civic; 
    public string Street; 
    public City City; 
} 

これは市クラスです:

public class City 
{ 
    public int Id; 
    public string Name; 
    public string SearchableName{ get { //code } } 
} 

アドレスは自分のテーブルに保存し、への参照を持っています市のID。都市も自分のテーブルに固執しています。

市のSearchableNameは、都市のユーザーの入力ミスを防ぐために使用されます。たとえば、都市名が「モントリオール」の場合、検索可能な名前は「モントリオール」になります。都市名が "セントジョン"の場合、検索可能な名前は "stjohn"などとなります。

これは主に、複数の都市にタイプミスがあって検索することを防ぐために使用されます。

住所を保存するときに、リスナー/イベントで市が既にデータベースに登録されているかどうかを確認する必要があります。その場合は、挿入を取り消し、ユーザーの都市をデータベースで置き換えます。私は更新と同じ動作が欲しいです。

私はこの試みた:

public bool OnPreInsert(PreInsertEvent @event) 
{ 
    City entity = (@event.Entity as City); 

    if (entity != null) 
    { 
     if (entity.Id == 0) 
     { 
      var city = (from c in @event.Session.Linq<City>() 
         where c.SearchableName == entity.SearchableName 
         select c).SingleOrDefault(); 
      if (city != null) 
      { 
       //don't know what to do here 
       return true; 
      } 
     } 
    } 

    return false; 
} 

をしかし、市は、データベースにすでにありますならば、私は何をすべきかわかりません。 @ event.Entityは読み取り専用です。@ event.Entity.Idを設定すると、「null識別子」例外が発生します。私はアドレスと会社の上に挿入/更新をトラップしようとしましたが、最初に挿入された場合はそれがロジックです...)

どのような考えですか?

ありがとうございました

+0

なぜイベントリスナーでそれをやりたいのだろうと思いますが、コードの一部ではなく、アドレスオブジェクトを作成しますか?イベントリスナーを使用する場合は、アドレスにIDがある場合のみ動作する提案があります。住所にはIDがありますか? – Paco

+0

はい、アドレスにIDがあります。それは、企業、顧客、ユーザーなどを追加/更新するときにアドレスが使用されるためです。私は一度だけ何かを書きたいと思います。また、別のクラスのアドレスクラス参照を追加すると(アドレスを指定してサプライヤクラスを追加するなど)、そのクラスの検索/置換を行う必要はありません。 – vIceBerg

+0

私はイベント/リスナー以外のソリューションにはオープンしています。 – vIceBerg

答えて

0

私は、このクラスの挿入と更新を処理するためにStored Procを使用することにしました。

検索可能な名前が既に存在する場合、SPはそのIDを返します。それ以外は挿入します。

正常に動作します。

1

これは間違ったレベルで扱っています。

これは、イベントリスナーではなく、はるかに高いレベル(サービス、モデルなどと呼ばれます)で発生します。は、新しいレコードを挿入しようとする前に

サービスは、必要に応じてそれを更新/作成、SearchableNameによって都市をロードしようとする必要があります。

+0

私のマッピングでは、Companyクラスがアドレスを保存する責任があります。私は会社のコレクション(myCie.AddAddress(myNewAddress))にアドレスを追加し、session.save(myCie)を呼び出してすべてを処理します。私が@Pacoへの私のコメントで言ったように、顧客はアドレスを持っています、ユーザーはアドレスを持っています。どのような場合でも住所の都市を扱うようなものが欲しいです。 – vIceBerg

+0

提案はありませんか? – vIceBerg

関連する問題