nhibernate 3.0乐观锁和相关实体

nhibernate 3.0乐观锁和相关实体,nhibernate,versioning,Nhibernate,Versioning,我注意到,在我的数据库(SQL Server)中,每当一个实体添加到相关表中时,我用于版本控制的列就会更新该实体 因此,例如,如果我有一个人实体,并且我将人添加到俱乐部,那么人在数据库中的记录将有一个新版本。当然,在数据库中,是使用个人主键添加/更新的俱乐部记录 我对这种行为感到有点惊讶,因为Person实体的其他数据没有改变 我的问题是,是否有一种方法可以关闭它;也就是说,仅在该行中的数据更改时更新版本列。这种配置可能意味着什么 编辑这是真正的代码 模型 我观察到的问题是,当创建新的Oblig

我注意到,在我的数据库(SQL Server)中,每当一个实体添加到相关表中时,我用于版本控制的列就会更新该实体

因此,例如,如果我有一个
实体,并且我将
添加到
俱乐部
,那么
在数据库中的记录将有一个新版本。当然,在数据库中,是使用
个人
主键添加/更新的
俱乐部
记录

我对这种行为感到有点惊讶,因为
Person
实体的其他数据没有改变

我的问题是,是否有一种方法可以关闭它;也就是说,仅在该行中的数据更改时更新版本列。这种配置可能意味着什么

编辑这是真正的代码

模型

我观察到的问题是,当创建新的ObligationProgramFundOrganization(关联表)时,ObligationProgramFund的记录版本会更新

实际情况是,我在“义务计划基金”编辑表单上有一个义务计划基金组织表。通过AJAX调用添加了一个ObligationProgramFundOrganization。当我转到然后保存ObligationProgramFund时,我得到一个并发异常。我确信没有其他用户真正编辑了ObligationProgramFund,因为它都在本地运行。

(我已经发布了一个类似问题的答案:)

您已指定版本列。这意味着任何属性更改(甚至集合)都会触发版本更新


为了防止某个属性/集合更改版本,应在xml映射中设置optimistic lock=“false”属性

那看起来很奇怪。一个俱乐部只能有一个人吗?这是通过增加一个人来更新俱乐部记录的唯一方法。你能发布你的类和映射吗?@Diego用真实的代码更新了我的问题。
public partial class ObligationProgramFund : IMyObject
{
    private System.Int32 _id;
    // ... many other properties
    private IList<ObligationProgramFundOrganization> _obligationPFOrganizations;
    private System.Byte[] _recordVersion;

    public ObligationProgramFund() : base()
    {
        _obligationPFOrganizations = new List<ObligationProgramFundOrganization>();
    }

    public virtual System.Int32 Id
    { 
        get { return _id; }
        set { _id = value; }
    }

    public virtual IList<ObligationProgramFundOrganization> ObligationPFOrganizations
    {
        get { return _obligationPFOrganizations; }
        set { _obligationPFOrganizations = value; }
    }

    public virtual System.Byte[] RecordVersion
    { 
        get { return _recordVersion; }
        set { _recordVersion = value; }
    }
}

public partial class ObligationProgramFundOrganization : IMyObject
{
    private ObligationProgramFund _obligationProgramFund;
    private System.Int32 _id;
    private Organization _organization;
    private System.Byte[] _recordVersion;
    // .. other properties

    public ObligationProgramFundOrganization() : base()
    {
    }

    public virtual System.Int32 Id
    { 
        get { return _id; }
        set { _id = value; }
    }

    public virtual System.Byte[] RecordVersion
    { 
        get { return _recordVersion; }
        set { _recordVersion = value; }
    }

    public virtual ObligationProgramFund ObligationProgramFund
    {
        get { return _obligationProgramFund; }
        set { _obligationProgramFund = value; }
    }

    public virtual Organization Organization
    {
        get { return _organization; }
        set { _organization = value; }
    }
}

public partial class Organization : IMyObject
{
    private IList<ObligationProgramFundOrganization> _obligationPFOrganizations;
    private System.Int32 _id;
    private System.Byte[] _recordVersion;
    // other properties

    public Organization() : base()
    {
        _obligationPFOrganizations = new List<ObligationProgramFundOrganization>();
    }

    public virtual System.Int32 Id
    { 
        get { return _id; }
        set { _id = value; }
    }

    public virtual System.Byte[] RecordVersion
    { 
        get { return _recordVersion; }
        set { _recordVersion = value; }
    }

    public virtual IList<ObligationProgramFundOrganization> ObligationPFOrganizations
    {
        get { return _obligationPFOrganizations; }
        set { _obligationPFOrganizations = value; }
    }
}
public partial class ObligationProgramFundMap : ClassMap<ObligationProgramFund>
{
    public ObligationProgramFundMap()
    {
        Table("[MySchema2].[dbo].[ObligationProgramFund]");
        OptimisticLock.Version();
        DynamicUpdate();
        LazyLoad();

        Id(x=>x.Id)
            .Access.CamelCaseField(Prefix.Underscore)
            .Column("[Id]")
            .GeneratedBy.Identity();
        Version(x=>x.RecordVersion)
            .Access.CamelCaseField(Prefix.Underscore)
            .Column("[RecordVersion]")
                .CustomSqlType("timestamp")
                .Not.Nullable()
            .UnsavedValue("null")
            .CustomType("BinaryBlob")
            .Generated.Always();
            // other properties/components

        HasMany(x=>x.ObligationPFOrganizations)
            .Access.CamelCaseField(Prefix.Underscore)
            .Cascade.AllDeleteOrphan()
            .Fetch.Select()
            .Inverse()
            .LazyLoad()
            .KeyColumns.Add("ObligationProgramFundId"); 
        } 
    } 

public partial class ObligationProgramFundOrganizationMap : ClassMap<ObligationProgramFundOrganization>
{
    public ObligationProgramFundOrganizationMap()
    {
        Table("[MySchema2].[dbo].[ObligationProgramFundOrganization]");
        OptimisticLock.Version();
        DynamicUpdate();
        LazyLoad();

    Id(x=>x.Id)
        .Access.CamelCaseField(Prefix.Underscore)
        .Column("[Id]")
        .GeneratedBy.Identity();
    Version(x=>x.RecordVersion)
        .Access.CamelCaseField(Prefix.Underscore)
        .Column("[RecordVersion]")
            .CustomSqlType("timestamp")
            .Not.Nullable()
        .UnsavedValue("null")
        .CustomType("BinaryBlob")
        .Generated.Always();

    // other properties      

    References(x=>x.ObligationProgramFund)
        .Access.CamelCaseField(Prefix.Underscore)
        .Cascade.SaveUpdate()
        .Fetch.Select()
        .Columns("ObligationProgramFundId");
    References(x=>x.Organization)
        .Access.CamelCaseField(Prefix.Underscore)
        .Cascade.SaveUpdate()
        .Fetch.Select()
        .Columns("OrganizationId");
    } 
}

public partial class OrganizationMap : ClassMap<Organization>
{
    public OrganizationMap()
    {
        Table("[MySchema2].[dbo].[Organization]");
        OptimisticLock.Version();
        DynamicUpdate();
        LazyLoad();

        Id(x=>x.Id)
            .Access.CamelCaseField(Prefix.Underscore)
            .Column("[Id]")
            .GeneratedBy.Identity();
        Version(x=>x.RecordVersion)
            .Access.CamelCaseField(Prefix.Underscore)
            .Column("[RecordVersion]")
            .CustomSqlType("timestamp")
            .Not.Nullable()
            .UnsavedValue("null")
            .CustomType("BinaryBlob")
            .Generated.Always();

        // other properties

        HasMany(x=>x.ObligationPFOrganizations)
            .Access.CamelCaseField(Prefix.Underscore)
            .Cascade.AllDeleteOrphan()
            .Fetch.Select()
            .Inverse()
            .LazyLoad()
            .KeyColumns.Add("OrganizationId");
    } 
}
Organization 1 - ∞ ObligationProgramFundOrganization ∞ - 1 ObligationProgramFund