C# 更新column1=column1+;10英寸NHibernate
在NHibernate中有没有一种方法可以让它生成SQL,向列添加一个值,如更新column1=column1+10 这适用于两个连接可能正在更新值,并且select后跟update将无法正常工作时的并发更新 另一种方式似乎在映射文件中包含以下行:C# 更新column1=column1+;10英寸NHibernate,c#,nhibernate,C#,Nhibernate,在NHibernate中有没有一种方法可以让它生成SQL,向列添加一个值,如更新column1=column1+10 这适用于两个连接可能正在更新值,并且select后跟update将无法正常工作时的并发更新 另一种方式似乎在映射文件中包含以下行: optimistic-lock="dirty" dynamic-update="true" 然后,代码将如下所示: byte tryAgain = 3; while( --tryAgain >= 0 ) { try {
optimistic-lock="dirty"
dynamic-update="true"
然后,代码将如下所示:
byte tryAgain = 3;
while( --tryAgain >= 0 )
{
try {
using (ISession s = OpenSession())
using (ITransaction tx = s.BeginTransaction())
{
var person = s.Query<X>().Where(o => o.Y == z ).FirstOrDefault();
if( person != null ) {
person.Column1 = person.Column1 + myValue;
s.Update( person );
}
break;
}
} catch ( StaleObjectException ) {
if( tryAgain == 0 ) {
throw;
}
}
}
字节tryAgain=3;
而(--tryAgain>=0)
{
试试{
使用(ISession s=OpenSession())
使用(ITransaction tx=s.BeginTransaction())
{
var person=s.Query().Where(o=>o.Y==z).FirstOrDefault();
if(person!=null){
person.Column1=person.Column1+myValue;
s、 更新(人);
}
打破
}
}捕获(StaleObjectException){
如果(tryAgain==0){
投掷;
}
}
}
处理这种情况的代码量并不太差,但是
update column1=column1+x是一个非常好的基本SQL功能,如果有一种方法可以表达这样一个事实,即映射中映射类的字段表示一个增量而不是绝对值,那么它将非常酷
感谢是前进
使用HQL的Tymek
s.CreateQuery("UPDATE person SET Property1=Property1 + :p1")
.SetParameter("p1", myValue)
.ExecuteUpdate();
使用HQL
s.CreateQuery("UPDATE person SET Property1=Property1 + :p1")
.SetParameter("p1", myValue)
.ExecuteUpdate();
是的,这是一个显而易见的答案。是我的错,我没有提到我不想写SQL,呵呵。这是HQL而不是SQL,所以你处理的是实体而不是列。你说得对,我说得不准确。我的意思是:我不想使用魔法字符串。那么你就不走运了,在纯.NET中,你不能说“更新所有x类型对象的属性'y=y+10',你总是
lock(object){//make changes}
这与上面的代码几乎相同,带有乐观锁定是的,这是一个显而易见的答案。是我的错,我没有提到我不想写SQL,呵呵。这是HQL而不是SQL,所以你处理的是实体而不是列。你说得对,我说得不准确。我的意思是:我不想使用魔法字符串。那么你就不走运了,在纯.NET中,你不能说“更新所有x类型对象的属性'y=y+10',你总是lock(object){//makechanges}
这与上面的乐观锁定代码几乎相同