初心者アラート データベースにエンティティが存在するかどうかを確認しようとしています。存在する場合は更新し、そうでない場合は新しいエンティティを作成します。しかし、CreateCriteria の使用は常に ID のないエンティティを返しますか? 理由はありますか?手動マッピング、つまりClassMapの使用に流暢なnhibernateを使用しています。
基本クラス - Id パブリック プロパティのみを保持
public 抽象クラス EntityBase : IEquatable { public virtual int Id { get; 設定; }
public virtual bool Equals(EntityBase obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (GetType() != obj.GetType()) return false;
return obj.Id == Id;
}
}
マッピング;
public class ProjectNameMap: ClassMap<ProjectName> { public ProjectNameMap() { Table("dbo.TABLENAME"); Id(x => x.Id).GeneratedBy.Identity(); Map(x => x.PROJECT_NAME).Not.Nullable(); Map(x => x.PROJECT_DESCRIPTION); } }
エンティティを取り戻す;
public static T GetEntityByRestrictions<T>(String propertyName, String propertyValue) where T:EntityBase { using (var session = SessionManager.CreateSessionFactory().OpenSession()) { using (var transaction = session.BeginTransaction()) { var entity= session.CreateCriteria<T>(propertyValue) .Add(Restrictions.Eq(propertyName, propertyValue)) .UniqueResult<T>(); return entity; } } } }
私が試した 2 つのばかげたステップ (笑ってはいけない) 1. 私が試したばかげたステップは、既存のデータベース エントリに一致する Id =52 を手動で設定することでした。
- さらにばかげた手順 (笑い声が聞こえます) は、Map(x=>x.Id).Update().Insert() を含むようにマッピング ファイルを変更し、これにより INSERT_IDENTITY が OFF (または何か) に設定されます。
Id を持つエンティティを取得し、後で更新する最良の方法は何ですか?私の CreateCriteria に何か問題がありますか?