NHibernate更新不起作用

NHibernate更新不起作用,nhibernate,Nhibernate,我正在尝试使用NHibernate更新我的记录。到目前为止,我只创建了SELECT语句。现在我需要做一个更新,但我似乎无法让它工作 这是我正在调用的一个简化函数 public void UpdateDataEditedInDrobneAwarieGrid() { using (ISession session = NHibernateHelper.OpenSession()) { using (ITransaction tr

我正在尝试使用NHibernate更新我的记录。到目前为止,我只创建了SELECT语句。现在我需要做一个更新,但我似乎无法让它工作

这是我正在调用的一个简化函数

    public void UpdateDataEditedInDrobneAwarieGrid()
    {
        using (ISession session = NHibernateHelper.OpenSession())
        {
            using (ITransaction transaction = session.BeginTransaction())
            {

                    string query = "UPDATE [MESdb].[dbo].[LogIn] SET Uzytkownik='a..' WHERE ID=3";

                session.CreateSQLQuery(query);

                transaction.Commit();
            }
        }
    }
NHibernateHelper:

 public class NHibernateHelper
{

    private static ISessionFactory _sessionFactory;

    private static ISessionFactory SessionFactory
    {
        get
        {
            if (_sessionFactory == null)
            {

                var NHibernateConfig = new Configuration();
                NHibernateConfig.Configure(HttpContext.Current.Server.MapPath(
                @"~\Models\NHibernate\hibernate.cfg.xml"), "MESdb");
                NHibernateConfig.AddDirectory(new System.IO.DirectoryInfo(HttpContext.Current.Server.MapPath(
                @"~\Models\NHibernate\Mapping")));
                _sessionFactory = NHibernateConfig.BuildSessionFactory();
            }
            return _sessionFactory;
        }
    }

    public static ISession OpenSession()
    {
        return SessionFactory.OpenSession();
    }
}
有什么想法可能是错误的吗

SQL语句很好。在MSSQL服务器中选中它。

以作为会话的一部分执行更新。CreateSQLQueryquery;我们必须显式地调用ExecuteUpdate


通常,您将使用对象而不是编写SQL,例如:

public void UpdateDataEditedInDrobneAwarieGrid()
{
    using (ISession session = NHibernateHelper.OpenSession())
    using (ITransaction transaction = session.BeginTransaction())
    {
        var login = session.Get<LogIn>(3);
        login.Uzytkownik = "a..";
        transaction.Commit();
    }
}

请注意,您甚至不需要调用session.SaveOrUpdatelogin,如果只进行更新,则只需保存新对象即可将其附加到会话。许多人想知道为什么NHibernate会更新DB上的对象,尽管从未执行过SaveOrUpdate。另一方面,即使使用SaveOrUpdate/Save,更改也不会立即发送,但NHibernate会尝试对更改进行批处理,并以一行的形式发送,通常是在提交时。祝贺您,您离正确的NHibernate实现又近了一步,离常见错误和反模式也更远了!它是为批量更新而设计的,但不用于设置持久对象的属性。应检索和更改持久对象,然后在事务处理时自动更新。Commit@ErikHart这个评论不属于答案。它属于这个问题。而且也不正确。对于批量更新,Erik,你应该检查DML。CreateSQLQuery为我们提供了快速访问ADO.NET的功能,同时仍然由NHiberante管理。简单地说,有些情况下,您无法使用映射。相信我,你迟早会面对的;
public void UpdateDataEditedInDrobneAwarieGrid()
{
    using (ISession session = NHibernateHelper.OpenSession())
    using (ITransaction transaction = session.BeginTransaction())
    {
        var login = session.Get<LogIn>(3);
        login.Uzytkownik = "a..";
        transaction.Commit();
    }
}