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