2013-10-16 86 views
1

我试图做一个快速更新的查询,而无需加载更新值 我试图用这个代码流利,NHibernate的查询,无负载

public void Save(int PlayerID, string Column, object Value) 
     { 
      using (ISession session = new SessionManager(_connectionString).Open()) 
      { 
       IQuery query = session.CreateQuery("UPDATE Players SET " + Column + "= :newValue WHERE PlayerID=:PlayerID"); 
       query.SetParameter("newValue", Column); 
       query.SetParameter("PlayerID", PlayerID); 
       query.ExecuteUpdate(); 
      } 
     } 

,但我得到,而其实际映射误差球员没有映射而且我已经在另一个声明中使用它。

+0

你已映射Player或球员?我猜你的UPDATE语句最后的** s ** *(Players)*可能是问题 –

回答

1

我猜你的实体名称是Player而不是玩家s对不对?

IQuery query = session.CreateQuery("UPDATE Player SET " + Column + "= :newValue WHERE PlayerID=:PlayerID"); 
      query.SetParameter("newValue", Column); 
      query.SetParameter("PlayerID", PlayerID); 
      query.ExecuteUpdate(); 

您不必在hql中指定表的名称,只是实体的名称。

除此之外,您可以使用代理,只需使用session.Load(...)为给定的ID加载代理对象。这不会影响数据库。但是你可以使用代理session.Delete这个对象。

看到更多细节在这里: http://nhibernate.info/blog/2009/04/29/nhibernate-the-difference-between-get-load-and-querying-by-id.html

+0

,但是使用session.load我应该对所有语句使用同一个会话? –

+0

是的,这是正确的,但我的意思是,你可以随时在每个会话中使用加载,它只会创建一个具有ID的代理对象,没有别的,直到你访问任何属性,它不会碰到数据库... 如果对象已经在会议中它将简单地返回原因之一 – MichaC