gpt4 book ai didi

c# - 一个web应用场景中NHibernate乐观并发的问题

转载 作者:行者123 更新时间:2023-12-04 05:02:35 24 4
gpt4 key购买 nike

我正在使用 Version 字段来控制 ASP.NET MVC 4 应用程序中的并发性。

映射:

      <class name="User" table="Users">
<id name="Id">
<generator class="native"/>
</id>
<version name="Version" column="Version"/>
... other fields omitted for brevity...

实体:
    public class User
{
public virtual int Id { get; set; }
public virtual int Version { get; set; }
... other fields omitted for brevity...

我正在使用以下方法:
  • 通过 Id 读取实体并映射到我的 UserDto 实体(Dto 用于数据传输对象模式),还包括版本字段
  • 显示用于编辑 UserDto 实体的表单
  • 接收 POSTed UserDto 实体

  • 然后我执行以下操作:
            // read the original entity from the database using my repository wrapper around NHibernate
    var rep = RepositoryFactory.Create<User>(currentUnitOfWork);
    User originalEntity = rep.GetById(userDto.Id);

    // optimistic lock control - keep the version as the user saw it
    originalEntity.Version = userDto.Version;
    ... other fields omitted for brevity...

    rep.Update(originalEntity);

    问题是,即使 userDto.Version 与 originalEntity.Version 不匹配,NHibernate 也会忽略我的 userDto.Version 并使用 originalEntity.Version (显然,来自一级缓存,因为实体刚刚被读取)。
    这种行为使我的 Version 字段完全无用。

    如何强制 NHibernate 使用我提供的 Version 值而不是缓存的值?

    此外,以某种方式使版本控制对使用我的存储库的其他程序员更加透明会很棒,但目前我不知道如何让它从接收到的实体中自动获取版本并强制 NHibernate 在没有程序员的情况下使用它甚至注意到它。

    有什么想法吗?

    最佳答案

    您需要意识到以下示例中的乐观并发仅在作为 一部分创建的 ISession 的范围内工作。此 网络请求。因此,如果用户在此请求时的版本值为 5,那么它将用于确保用户行未被更新。

        // read the original entity from the database using my repository wrapper around NHibernate
    var rep = RepositoryFactory.Create<User>(currentUnitOfWork);
    User originalEntity = rep.GetById(userDto.Id);

    // optimistic lock control - keep the version as the user saw it
    originalEntity.Version = userDto.Version;
    ... other fields omitted for brevity...

    rep.Update(originalEntity);

    因此,要获得所需的行为,您需要做
    User originalEntity = rep.GetById(userDto.Id);
    if (originalEntity.Version != userDto.Version) throw new ConcurrencyException();

    详见 documentation我希望你更愿意调用与以下内容松散一致的东西
    var @object = userDto.ToUser();
    myisession.SaveOrUpdate(@object);

    关于c# - 一个web应用场景中NHibernate乐观并发的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15968861/

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