2

新手警报我正在尝试检查数据库中是否存在实体,如果存在我想更新它,否则创建一个新实体。但是 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=>x.Id).Update().Insert() ,这导致 INSERT_IDENTITY 设置为 OFF (或其他)。

那么获取具有 Id 的实体并在之后更新的最佳方法是什么,我的 CreateCriteria 有什么问题吗?

4

1 回答 1

0

我相信在会话上调用Merge方法将完全符合您的要求。

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

于 2011-07-29T16:14:48.567 回答