如何使用nhibernate createcriteria获取实体的id

时间:2011-05-03 14:27:14

标签: fluent-nhibernate nhibernate-criteria

新手警报 我试图检查数据库中是否存在实体,如果它确实要更新它,则创建新实体。但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匹配现有数据库条目,并且我继续在项目名称上获得主键违规,因为数据库需要唯一的项目名称。

  1. 更愚蠢的步骤(我可以听到笑声)修改了映射文件以包含Map(x =&gt; x.Id).Update()。Insert()这导致INSERT_IDENTITY设置为OFF(或某些东西)。
  2. 那么获得带有Id的实体并在之后更新的最佳方式是什么,我的CreateCriteria有什么问题吗?

1 个答案:

答案 0 :(得分:0)

我相信在会话中调用合并方法会完全符合您的要求。

只需将要更新/插入的实体作为参数放入,如果实体已经存在,它将更新属性,否则将保留新实例。这样您就不需要 CreateCriteria ,您的解决方案会更加简单。