我在实体中使用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)]
输入的问题是否改变的东西,如果你只插入persistedObj.ChangeTestData(“测试”)后的虚拟财产的访问; (var dummyTest = persistedObj.LazyData;)? – jbl