【问题标题】:NHibernate version property is not workingNHibernate 版本属性不起作用
【发布时间】:2012-03-09 04:50:19
【问题描述】:

使用 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());
    }

【问题讨论】:

  • 显示更新的代码。你用session.Merge()吗?
  • 不,我使用常规 session.SaveOrUpdate()。我将在大约一个小时后开始工作时显示代码。谢谢。
  • 是的,请显示将更改保存到数据库的代码。
  • @DanielSchilling 给你(代码)。

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


【解决方案1】:

您说版本更新很好,因此不应用约定。

我猜没有真正的并发更新。您使用Load(model.Guid),它不会从数据库中加载对象,而是为它创建一个代理。它在TransferFormValuesTo 中加载并更新并立即保存。只有在 TransferFormValuesToSaveOrUpdate() 之间才会存在导致过时对象的竞争条件。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 2012-01-06
    • 1970-01-01
    • 2016-02-06
    • 2019-07-23
    • 2011-03-31
    • 2018-11-19
    相关资源
    最近更新 更多