C# NHibernate中不带HQL模式的更新方法

C# NHibernate中不带HQL模式的更新方法,c#,nhibernate,fluent-nhibernate,hql,C#,Nhibernate,Fluent Nhibernate,Hql,我想在NHibernate中创建一个带有限制的更新方法(where子句),但我不想使用HQL模式 例如,我的SQL查询: "update NFE set SEFAZ_STATUS_DATA=@SEFAZ_STATUS_DATA,MENSAGEM_ERRO=@MENSAGEM_ERRO" 没有HQL我怎么办 这样行吗 public virtual T Alterar(List<ICriterion> lstCriterios, T entity) { try {

我想在NHibernate中创建一个带有限制的更新方法(where子句),但我不想使用HQL模式

例如,我的SQL查询:

"update NFE set SEFAZ_STATUS_DATA=@SEFAZ_STATUS_DATA,MENSAGEM_ERRO=@MENSAGEM_ERRO"
没有HQL我怎么办

这样行吗

public virtual T Alterar(List<ICriterion> lstCriterios, T entity)
{
    try
    {
        using (ISession session = SessionFactory.OpenSession())
        {
            ICriteria criterio = session.CreateCriteria(typeof(T));

            foreach (ICriterion cri in lstCriterios)
            {
                criterio.Add(cri);
            }

            session.Update(entity);

            return entity;
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
}
public virtual T Alterar(列出标准,T实体)
{
尝试
{
使用(ISession session=SessionFactory.OpenSession())
{
ICriteria criterio=session.CreateCriteria(typeof(T));
foreach(第1阶段标准中的ICRITERONCRI)
{
标准添加(cri);
}
更新(实体);
返回实体;
}
}
捕获(例外情况除外)
{
掷骰子;
}
}

通常,有两种方法可以执行更新。一个是基于会话的,第二个是用DML表示的

事务性持久性实例(即ISession加载、保存、创建或查询的对象)可由应用程序操作,并且在刷新ISession时(本章稍后讨论)将持久化对持久性状态的任何更改。所以更新对象状态最直接的方法是加载()对象,然后在ISession打开时直接操作它

因此,在我们的例子中,我们可以使用任何类型的查询将实体(条件、QueryOver、query)加载到会话中。这意味着不需要HQL

然后在服务器/应用层(C#)上更新所有对象,然后刷新会话。。所有更改都将被持久化

这种方法需要大量的后台处理(从SQL选择创建实体…创建更新语句…),但对于NHiberante/ORM来说是非常原生的

using (ISession session = SessionFactory.OpenSession())
{
    var criteria = session.CreateCriteria<T>();

    // I. use criteria to find what should be changed    
    foreach (var cri in lstCriterios)
    {
        criterio.Add(cri);
    }

    // II. load the searched
    var list = session.List<T>();

    // III. update entities in runtime
    foreach(var entity in list)
    {
       entity.Property1 = newValue1;
       entity.Property2 = newValue2;
       ...
    }

    // IV. UPDATE == flush
    session.Flush();
}
虽然这种方法给了我们很好的性能,但它基于HQL(与上述要求相反)

小结:有了NHibernate,我们可以使用不带HQL的强大查询将数据加载到会话中,用C#操作它们,一个一个地保存更改。。。或者我们可以使用HQL创建DML语句,并直接在服务器上执行更新


另请参见:by Ayende

这种情况下,我想创建一个通用方法,在这里我可以传递参数和实体,然后通用方法将根据报告的参数执行更新,在我的情况下,这将是一个标准列表。基于我向您展示的使用Session not HQL的示例,您知道我如何做到这一点吗?所以我不需要写很多命令更新…我只是用方法内容的草稿更新/扩展我的答案。。。只需1)创建条件2)加载结果3)更新加载4)调用刷新。。。那就行了。事实上,这是非常简化的标准写入操作方式,我每天都会执行。更复杂的是,这几乎是标准的更新方法。。。这有帮助吗?在你扩展后,答案比我需要的更接近,但在我的情况下,因为我需要提供一个通用实体(T)作为参数,我无法运行摘录III…Criteria API绝对适合于通用实体。。。您将收到一些搜索参数,例如表示名称的字符串,您将使用它们作为
。添加(Restriction.PropertyEa(“FirstName”,FirstName”)
…试着玩一玩。同样,您可以构建非常强大的处理。另外,请阅读。我想这会让您了解如何做到这一点。祝NHiberante好运
ISession session = sessionFactory.OpenSession();
ITransaction tx = session.BeginTransaction();

string hqlUpdate = "update Customer c set c.name = :newName where c.name = :oldName";
// or string hqlUpdate = "update Customer set name = :newName where name = :oldName";
int updatedEntities = s.CreateQuery( hqlUpdate )
        .SetString( "newName", newName )
        .SetString( "oldName", oldName )
        .ExecuteUpdate();
tx.Commit();
session.Close();