【问题标题】:Microsoft Sync Framework clashes with Nhibernate TooManyRowsAffectedexceptionMicrosoft Sync Framework 与 Nhibernate TooManyRowsAffectedexception 发生冲突
【发布时间】:2011-01-24 03:04:41
【问题描述】:

我们正在尝试将 Microsoft Sync Framework 实施到我们的应用程序中,该应用程序使用 NHibernate 持久化其域。

我们遇到的一个问题是,在 Sync Framework 更改了您的初始数据库结构(添加影子表和触发器)之后,当您尝试将对象插入数据库时​​,NHibernate 似乎会因为抛出 toomanyrowsaffectedexception 而感到不安。

我发现这篇文章有在每个更新语句周围添加 SET NOCOUNT ON 和 OFF 的解决方案,但是由于表结构是由 nhibernate 自动生成的,同步触发器是由 Sync Framework 自动生成的,手动调整所有触发器不是真的是一个选择。

http://www.codewrecks.com/blog/index.php/2009/03/25/nhibernate-and-toomanyrowsaffectedexception/

我尝试设置 sql server 2008 属性 NOCOUNT,如以下问题所述:Where's the best place to SET NOCOUNT? 但这导致了 StaleStateException(-1 行受影响,预期为 1)。

你们知道是否有一种方法可以配置同步框架以在其触发器中自动设置这些 NOCOUNT 语句?或者也许有办法告诉 NHibernate 期望更多/更少的行已经改变? 或者也许你们中的任何人都有一个自动脚本来将这些 NOCOUNT 语句添加到同步框架的触发器中。

提前谢谢!

【问题讨论】:

    标签: c# .net nhibernate microsoft-sync-framework nocount


    【解决方案1】:

    我认为 NOCOUNT 方式是要走的路。您可以通过为同步框架使用的所有表设置 NOCOUNT 来做到这一点。请参阅下面的代码。另一种方法是修补 NHibernate 并忽略更新计数,请参阅 (https://nhibernate.jira.com/browse/NH-1353)。

    韩国,

    保罗

        class SqlSyncTriggerHelper
    {
        private const string triggerSql = @"select sys.triggers.name from sys.triggers, sys.objects
            where sys.objects.name='{0}' and sys.objects.type = 'U' and sys.triggers.parent_id = sys.objects.object_id";
    
        private DbSyncScopeDescription syncScopeDescription;
    
        public SqlSyncTriggerHelper(DbSyncScopeDescription syncScopeDescription)
        {
            this.syncScopeDescription = syncScopeDescription;
        }
    
        public void Apply(SqlConnection conn)
        {
            SqlTransaction transaction = null;
            try
            {
                if (conn.State == System.Data.ConnectionState.Closed)
                {
                    conn.Open();
                }
                transaction = conn.BeginTransaction();
                foreach (var table in syncScopeDescription.Tables)
                {
                    foreach (string trigger in GetTriggers(table.UnquotedLocalName, conn, transaction))
                    {
                        AlterTrigger(trigger, conn, transaction);
                    }
                }
                transaction.Commit();
            }
            catch
            {
                if (transaction != null)
                {
                    transaction.Rollback();
                }
                throw;
            }
            finally
            {
                if (transaction != null)
                {
                    transaction.Dispose();
                }
                conn.Close();
            }
        }
    
        private void AlterTrigger(string trigger, SqlConnection conn, SqlTransaction transaction)
        {
            SqlCommand newCmd = new SqlCommand(string.Format("exec sp_helptext '{0}'", trigger), conn, transaction);
            var triggerStringBuilder = new StringBuilder();
            using (var reader = newCmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    triggerStringBuilder.Append(reader.GetValue(0) as string);
                }
            }
            var triggerString = triggerStringBuilder.ToString();
            triggerString = triggerString.Replace("CREATE TRIGGER", "ALTER TRIGGER").Replace(" AS\n", " AS\nSET NOCOUNT ON\n") + "\nSET NOCOUNT OFF";
            var alterTriggerCommand = new SqlCommand(triggerString, conn, transaction);
            alterTriggerCommand.ExecuteNonQuery();
        }
    
        private IEnumerable<string> GetTriggers(string tableName, SqlConnection conn, SqlTransaction transaction)
        {
            var resultList = new List<string>();
            var command = new SqlCommand(string.Format(triggerSql, tableName), conn, transaction);
            using (var reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    resultList.Add(reader.GetString(0));
                }
            }
            return resultList;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-02
      • 1970-01-01
      • 1970-01-01
      • 2020-02-25
      相关资源
      最近更新 更多