1
我有一个遗留数据库,其中一些存储过程计算所有表的行ID。 现在我想覆盖IIdentifierGenerator暗示在此页http://www.richter-web.info/Wordpress/?p=132 只是为了避免Id(x => x.id).GenereatedBy.Assigned。NHibernate从会话提取DBTransaction
现在我节省一些对象,当然是NHibernate的交易,命名AppendixHierarchy内,那么只要它进入ATKIdGenerator.Generate并开始command.ExecuteNonQuery()我收到一些例外 的ExecuteNonQuery要求命令有当分配给该命令的连接处于未决本地事务中时的事务。该命令的Transaction属性尚未初始化。
如何从Nhibernate会话对象中提取数据库事务,以便将其附加到命令中?
我用FluentMapping的POCO
public AppendixHierarchyMap()
{
Table("appendixHierarchy");
Id(x => x.id).GeneratedBy.Custom(typeof(ATKIdGenerator), a => a.AddParam("TableName", "appendixHierarchy"));
.....
这里是ID生成
public class ATKIdGenerator : IIdentifierGenerator, IConfigurable
{
private string TableName { get; set; }
#region IIdentifierGenerator Members
public object Generate(NHibernate.Engine.ISessionImplementor session, object obj)
{
IDbCommand command = new SqlCommand();
command.Connection = session.Connection;
//transaction.Enlist(command);
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "dbo.ups_GetNewId";
// Set input parameters
var parm = new SqlParameter("@tableName", SqlDbType.VarChar);
parm.Value = TableName;
command.Parameters.Add(parm);
// Set output parameter
var outputParameter = new SqlParameter("@id", SqlDbType.Int);
outputParameter.Direction = ParameterDirection.Output;
command.Parameters.Add(outputParameter);
// Set a return value
var returnParameter = new SqlParameter("@RETURN_VALUE", SqlDbType.Int);
returnParameter.Direction = ParameterDirection.ReturnValue;
command.Parameters.Add(returnParameter);
// Execute the stored procedure
command.ExecuteNonQuery();
return (int)((SqlParameter)command.Parameters["@id"]).Value;
}
#endregion
#region IConfigurable Members
public void Configure(NHibernate.Type.IType type, IDictionary<string, string> parms, NHibernate.Dialect.Dialect d)
{
TableName = parms["TableName"];
}
#endregion
}
这工作基本上。但它以某种方式缓慢。 在我调用Save的任何实体之前,它会调用Generate,然后在应用该实体的实际插入之前需要60秒... 这太慢了...... – urpcor 2009-12-04 11:07:19