私は、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識別子」例外が発生します。私はアドレスと会社の上に挿入/更新をトラップしようとしましたが、最初に挿入された場合はそれがロジックです...)
どのような考えですか?
ありがとうございました
なぜイベントリスナーでそれをやりたいのだろうと思いますが、コードの一部ではなく、アドレスオブジェクトを作成しますか?イベントリスナーを使用する場合は、アドレスにIDがある場合のみ動作する提案があります。住所にはIDがありますか? – Paco
はい、アドレスにIDがあります。それは、企業、顧客、ユーザーなどを追加/更新するときにアドレスが使用されるためです。私は一度だけ何かを書きたいと思います。また、別のクラスのアドレスクラス参照を追加すると(アドレスを指定してサプライヤクラスを追加するなど)、そのクラスの検索/置換を行う必要はありません。 – vIceBerg
私はイベント/リスナー以外のソリューションにはオープンしています。 – vIceBerg