首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用NHibernate更新数据库中的版本列

如何用NHibernate更新数据库中的版本列
EN

Stack Overflow用户
提问于 2020-11-13 00:25:57
回答 1查看 73关注 0票数 0

现在:

代码语言:javascript
复制
//banan get in previous session and banan.VersionObject = 1
using (var session = factorySession.OpenSession())
          {
              banan.Name = "diffrent";
              session.Update(banan);
              session.Flush();//exception if version not equal 1
          }
//banan.VersionObject still equals 1

我的hbm配置:

代码语言:javascript
复制
<class xmlns="urn:nhibernate-mapping-2.2" dynamic-insert="true" dynamic-update="true" optimistic-lock="version" name="LittleNHibernateProject.Model.FatherBanan, LittleNHibernateProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="FatherBanan">
    <cache region="FatherBanan" usage="read-write" />
    <id name="Id" type="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Id" />
      <generator class="increment" />
    </id>
    <version generated="always" name="VersionObject" type="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" unsaved-value="0">
      <column name="VersionObject" not-null="true" default="1" />
    </version>
    <any id-type="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" meta-type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="WifeBanan">
      <meta-value value="MotherBanan" class="LittleNHibernateProject.Model.MotherBanan, LittleNHibernateProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
      <meta-value value="FatherBanan" class="LittleNHibernateProject.Model.FatherBanan, LittleNHibernateProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
      <column name="Banan_Type" />
      <column name="Banan_Id" />
    </any>
    <property name="Name" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Name" />
    </property>
    <property name="Variety" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Variety" />
    </property>
  </class>

我看到两条路:

  1. 在数据库中使用触发器。但我不希望为所有实体创建触发器。

代码中的

  1. ,类似于:

代码语言:javascript
复制
using (var session = factorySession.OpenSession())
          {
              banan.Name = "diffrent";
              session.Update(banan);
              session.Flush();//exception if version change

              banan.VersionObject = banan.VersionObject + 1;
              session.Update(banan);
              session.Flush();
          }

而这条(2条路)看上去就像是糟糕的做法。有什么建议吗练习?还是我的config.hbm不正确?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-13 05:04:55

是的,我在数据库中的所有表上创建触发器。

代码语言:javascript
复制
            var factory = new DbConfigurationFactory();
            var factorySession = factory.CreateFactory();

            var allClasses = factorySession.GetAllClassMetadata();

            //ReCreate triggers in database
            foreach (var metadata in allClasses)
            {
                var tableName = (metadata.Value as NHibernate.Persister.Entity.AbstractEntityPersister).TableName;

                using (var session = factorySession.OpenSession())
                {
                    var commandText = $@"
DROP TRIGGER IF EXISTS {tableName}trigger ON public.{tableName};

CREATE TRIGGER {tableName}trigger
    BEFORE UPDATE ON public.{tableName}
FOR EACH ROW EXECUTE PROCEDURE update_version_func();
";
                    var command = session.Connection.CreateCommand();
                    command.CommandText = commandText;
                    command.ExecuteNonQuery();
                }
            }

这项工作是:

代码语言:javascript
复制
            FatherBanan banan = null;
            FatherBanan banan2 = null;
            using (var session = factorySession.OpenSession())
            {
                banan = session.Get<FatherBanan>((long)4);
                //banan.VersionObject = 1
            }

            using (var session = factorySession.OpenSession())
            {
                banan2 = session.Get<FatherBanan>((long)4);
                //banan2.VersionObject = 1
            }

            using (var session = factorySession.OpenSession())
            {
                banan.Name = "PPPP";
                session.Update(banan);
                session.Flush();
                //banan.VersionObject = 2
            }

            using (var session = factorySession.OpenSession())
            {
                var newBanan = session.Get<FatherBanan>((long)4);
                //newBanan.VersionObject = 2
            }

            using (var session = factorySession.OpenSession())
            {
                banan2.Name = "PPPP2";
                session.Update(banan2);
                session.Flush();//exception banan2.VersionObject = 1 when in database VersionObject = 2
            }

其中update_version_func是:

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION public.update_version_func()
  RETURNS TRIGGER AS
$BODY$
BEGIN
    NEW.VersionObject = NEW.VersionObject +1;
    return NEW;
END
$BODY$
LANGUAGE plpgsql;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64813787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档