Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更新column1=column1+;10英寸NHibernate_C#_Nhibernate - Fatal编程技术网

C# 更新column1=column1+;10英寸NHibernate

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 {

在NHibernate中有没有一种方法可以让它生成SQL,向列添加一个值,如更新column1=column1+10

这适用于两个连接可能正在更新值,并且select后跟update将无法正常工作时的并发更新

另一种方式似乎在映射文件中包含以下行:

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}
这与上面的乐观锁定代码几乎相同