写真とタグの間に多対多の関係があります。写真には複数のタグを付けることができ、複数の写真で同じタグを共有できます。
ディレクトリ内の写真をスキャンして NHibernate に追加するループがあります。そのプロセス中にいくつかのタグが写真に追加されます。たとえば、写真が 2009 年に撮影された場合は 2009-tag です。
Tag クラスは Equals と GetHashCode を実装し、Name プロパティを唯一の署名プロパティとして使用します。Photo と Tag の両方に代理キーがあり、バージョン管理されています。
次のようなコードがあります。
public void Import() {
...
foreach (var fileName in fileNames) {
var photo = new Photo { FileName = fileName };
AddDefaultTags(_session, photo, fileName);
_session.Save(photo);
}
...
}
private void AddDefaultTags(…) {
...
var tag =_session.CreateCriteria(typeof(Tag))
.Add(Restriction.Eq(“Name”, year.ToString()))
.UniqueResult<Tag>();
if (tag != null) {
photo.AddTag(tag);
} else {
var tag = new Tag { Name = year.ToString()) };
_session.Save(tag);
photo.AddTag(tag);
}
}
私の問題は、タグが存在しない場合です。たとえば、新年の最初の写真です。AddDefaultTags メソッドは、タグがデータベースに存在するかどうかを確認し、タグを作成して NHibernate に追加します。これは、1 枚の写真を追加する場合はうまく機能しますが、新しい年に同じ作業単位内で複数の写真をインポートすると、データベースにまだ存在せず、再度追加されるため失敗します。作業単位を完了すると、同じ名前のタグ テーブルに 2 つのエントリを追加しようとするため失敗します...
私の質問は、NHibernate が上記の状況でデータベースに単一のタグのみを作成しようとすることを確認する方法です。新しく追加されたタグのリストを自分で維持する必要がありますか、それとも機能するようにマッピングを設定できますか?