【问题标题】:NHibernate 3.2 Object isn't updated during flush when lazy property is used使用惰性属性时,NHibernate 3.2 对象在刷新期间不会更新
【发布时间】:2013-03-14 20:41:30
【问题描述】:

我在我的实体中使用了延迟加载属性。它工作正常,但是当通过方法更改此类中的任何属性时,NHibernate 不会进行更新。如果直接更改属性,则一切正常。

我认为在返回惰性属性代理对象的情况下存在问题,并且此代理不处理内部更改。

我在下面添加了测试代码。它在 NHibernate 3.1 中运行良好,但在 NHibernate 3.2 和 3.3 中不调用更新

也许有人知道如何解决这个问题?

谢谢。

实体:

/// <summary>
/// Class for testing lazy properties.
/// </summary>
public class TestClass
{
    public virtual int Id { get; set; }
    public virtual string LazyData { get; set; }
    public virtual string TestData { get; set; }

    public virtual void ChangeTestData(string data)
    {
        TestData = data;
    }
}

映射:

public class TestClassMap : ClassMap<TestClass>
{
    public TestClassMap()
    {
        Id(m => m.Id);
        Map(m => m.LazyData).LazyLoad();
        Map(m => m.TestData);
    }
}

测试代码:

[Test]
public void LazyProperityTest1()
{
    var testObj = new TestClass();
    Session.Save(testObj);
    Session.Flush();
    Session.Clear();

    // Change property and flush session.
    var persistedObj = Session.CreateCriteria<TestClass>().List<TestClass>().First();
    persistedObj.ChangeTestData("test");

    Session.Flush();
    Session.Clear();
}

设置 LazyLoad 时生成的 sql 请求:

NHibernate: INSERT INTO "TestClass" (LazyData, TestData) VALUES (@p0, @p1); select last_insert_rowid();@p0 = NULL [Type: String (0)], @p1 = NULL [Type: String (0)]
NHibernate: SELECT this_.Id as Id0_0_, this_.TestData as TestData0_0_ FROM "TestClass" this_

未设置 LazyLoad 时生成的 sql 请求:

NHibernate: INSERT INTO "TestClass" (LazyData, TestData) VALUES (@p0, @p1); select last_insert_rowid();@p0 = NULL [Type: String (0)], @p1 = NULL [Type: String (0)]
NHibernate: SELECT this_.Id as Id0_0_, this_.LazyData as LazyData0_0_, this_.TestData as TestData0_0_ FROM "TestClass" this_
NHibernate: UPDATE "TestClass" SET LazyData = @p0, TestData = @p1 WHERE Id = @p2;@p0 = NULL [Type: String (0)], @p1 = 'test' [Type: String (0)], @p2 = 1 [Type: Int32 (0)]

【问题讨论】:

  • 如果您在 persistedObj.ChangeTestData("test"); 之后插入一个虚拟属性访问,它会改变什么吗? (var dummyTest = persistedObj.LazyData;) ?

标签: c# nhibernate fluent-nhibernate


【解决方案1】:

在我看来这绝对是一个错误,你有一个很好的测试用例来证明它。

请在https://nhibernate.jira.com/输入问题

【讨论】:

  • 这是一个错误,与其他一些已知错误有关:nhibernate.jira.com/browse/NH-3058 它已修复但尚未发布。我自己的“vNext”更新错误测试用例。
  • 当前版本的 NHibernate 是否有解决方法?我有一个 byte[] 属性,我正在延迟加载;不懒加载它太贵了。由于此处提到的错误,它没有更新。我正在使用 3.3.3.GA
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-30
  • 2018-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多