新手警报 我试图检查数据库中是否存在实体,如果它确实要更新它,则创建新实体。但CreateCriteria使用总是返回一个没有id的实体?有什么想法吗?我使用流利的nhibernate进行手工映射,即使用ClassMap;
基类 - 仅保留Id公共属性
公共抽象类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; } } } }
我尝试了两个愚蠢的步骤(不要笑) 1.我试过的愚蠢步骤是手动设置Id = 52匹配现有数据库条目,并且我继续在项目名称上获得主键违规,因为数据库需要唯一的项目名称。
那么获得带有Id的实体并在之后更新的最佳方式是什么,我的CreateCriteria有什么问题吗?
答案 0 :(得分:0)
我相信在会话中调用合并方法会完全符合您的要求。
只需将要更新/插入的实体作为参数放入,如果实体已经存在,它将更新属性,否则将保留新实例。这样您就不需要 CreateCriteria ,您的解决方案会更加简单。