2013-03-13 31 views
3

我在实体中使用lazyload属性。它的工作原理是正确的,但当这个类中的任何属性通过方法改变时,NHibernate不会更新。如果财产直接改变,那么一切都可以。在使用lazy属性时,NHibernate 3.2对象在刷新期间没有更新

我想这是一个懒惰的属性代理对象返回的问题,这个代理不处理内部的变化。

我在下面添加了测试代码。它在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); 
    } 
} 

测试代码:

时LazyLoad设置
[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(); 
} 

生成的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_ 

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

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)] 
+0

输入的问题是否改变的东西,如果你只插入persistedObj.ChangeTestData(“测试”)后的虚拟财产的访问; (var dummyTest = persistedObj.LazyData;)? – jbl

回答

1

这肯定看起来像我的错误,你有一个很好的测试案例来证明这一点。

https://nhibernate.jira.com/

+1

这是一个错误,与其他一些已知错误有关:https://nhibernate.jira.com/browse/NH-3058 它已修复但尚未发布。我自己的更新错误测试用例在“vNext”上传递。 –

+0

NHibernate的当前版本是否有解决方法?我有一个byte []属性,我懒加载;它不会延迟加载它太昂贵了。由于这里提到的错误,它没有更新。我正在使用3.3.3.GA – Jereme

相关问题