NHibernate版本属性不起作用

时间:2012-02-17 19:27:35

标签: asp.net-mvc nhibernate concurrency fluent-nhibernate

使用Sharp Architecture / Fluent NHibernate,我为我的类设置了一个Version属性(带有int),但是,即使更新其对象正确更新了版本号,也没有错误抛出,版本基本上合并而不是抛出异常。

public class MyClassMap : IAutoMappingOverride<MyClass>
{
    public void Override(AutoMapping<MyClass> mapping)
    {
        mapping.Version(x => x.Version);
        mapping.OptimisticLock.Version();
    }
}

请注意,两个并发提交的版本不同,但没有任何反应。

是什么给出了?

编辑:以下是代码:

    public ActionConfirmation SaveOrUpdate(IncidenciaDetalleModel model)
    {
        Incidencia incidencia = model.Codigo == null
                                    ? new Incidencia(Convert.ToInt32(model.Solicitante.Id))
                                    : Load(model.Guid);

        TransferFormValuesTo(incidencia, model);

        // Invoke Sharp NHibernate's SaveOrUpdate()
        Incidencia saved = base.SaveOrUpdate(incidencia);

        return ActionConfirmation.CreateSuccessConfirmation(saved);
    }



    private void TransferFormValuesTo(Incidencia incidencia, IncidenciaDetalleModel model)
    {
        incidencia.Resumen = model.Resumen.Trim();
        incidencia.Descripcion = model.Descripcion.Trim();
        incidencia.Solicitante = model.Solicitante.Id.ToString(CultureInfo.InvariantCulture);
        incidencia.Regional = regionalTask.Load(model.Regional.GetRegionalId());
    }

1 个答案:

答案 0 :(得分:2)

你说版本更新正常,所以不适用约定。

我猜没有真正的并发更新。你使用Load(model.Guid),它不会从数据库加载对象,但会为它创建一个代理。它已加载TransferFormValuesTo更新并立即保存。仅在TransferFormValuesToSaveOrUpdate()之间可能存在导致陈旧对象的竞争条件。

您可以启用“NHibernate.SQL”的日志记录,以查看客户端1的更新是否真的位于客户端2的SELECT之后