У меня есть устаревшая база данных, где некоторые сохраненные процедуры вычисляют идентификаторы строк для всех таблиц.
Теперь я хочу перезаписать IIdentifierGenerator, как указано на этой странице http://www.richter -web.info / Wordpress /? P = 132
просто чтобы избежать Id (x => x.id) .GenereatedBy.Assigned.
Теперь, когда я сохраняю некоторый объект, конечно, внутри транзакции Nhibernate, называемый AnnexHierarchy, затем, как только он попадает в 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 Generator
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
}