新手警报我正在尝试检查数据库中是否存在实体,如果存在我想更新它,否则创建一个新实体。但是 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 匹配现有的数据库条目,并且我不断收到项目名称的主键违规,因为数据库需要唯一的项目名称。
- 更愚蠢的步骤(我能听到笑声)修改了映射文件以包含 Map(x=>x.Id).Update().Insert() ,这导致 INSERT_IDENTITY 设置为 OFF (或其他)。
那么获取具有 Id 的实体并在之后更新的最佳方法是什么,我的 CreateCriteria 有什么问题吗?