gpt4 book ai didi

c# - Microsoft Sync Framework 与 Nhibernate TooManyRowsAffectedexception 发生冲突

转载 作者:太空狗 更新时间:2023-10-29 23:11:34 26 4
gpt4 key购买 nike

我们正在尝试将 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 语句添加到同步框架的触发器中。

提前致谢!

最佳答案

我认为 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;
}
}

关于c# - Microsoft Sync Framework 与 Nhibernate TooManyRowsAffectedexception 发生冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2387034/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com