|
From: Filip K. (JIRA) <nh...@gm...> - 2011-03-25 14:13:57
|
changes made in IPreInsert/UpdateEventListener are not persisted into DB on inherited classes
---------------------------------------------------------------------------------------------
Key: NH-2596
URL: http://216.121.112.228/browse/NH-2596
Project: NHibernate
Issue Type: Bug
Components: Core
Affects Versions: 3.0.0.Alpha3
Reporter: Filip Kinsky
Priority: Major
We're logging modification date in few of our persisted classes using simple
interface and basic IPreInsert/UpdateEventListener implementation which uses
this code to set LastModified field:
var trackable = entity as ITrackModificationDate;
if (trackable != null)
{
trackable.LastModified = DateTime.Now;
persister.SetPropertyValue(state, "LastModified", trackable.LastModified);
}
This works for basic classes without any inheritance hierarchy, but when I
map inherited classes (LastModified field implemented by the hierarchy
root) and update some property which exists just in the inherited class, the
listener is triggered, but the modified LastModified property value is not
being persisted into database. I isolated the problem and implemented
attached failing test, but I'm not able to figure out what should I do in
the listener to force NH to update the DB properly.
Test classes:
public class Thing : ITrackModificationDate
{
public virtual long Id { get; set; }
public virtual DateTime LastModified { get; set; }
}
public class InheritedThing: Thing
{
public virtual string SomeText { get; set; }
}
public class ThingMap : ClassMap<Thing>
{
public ThingMap()
{
Id(x => x.Id).GeneratedBy.Assigned();
Map(x => x.LastModified);
}
}
public class InheritedThingMap: SubclassMap<InheritedThing>
{
public InheritedThingMap()
{
Map(x => x.SomeText);
}
}
Failing test:
[Fact]
public void InheritedThing_LastModified_Should_BeSetOnUpdate()
{
var t = new InheritedThing {Id = 1, SomeText = "aa"};
session.Save(t);
session.Flush();
session.Clear();
Thread.Sleep(1000);
t = session.Get<InheritedThing>(1L);
t.SomeText = "bb";
session.Update(t);
session.Flush();
session.Clear();
t = session.Get<InheritedThing>(1L);
Assert.True(DateTime.Now.Subtract(t.LastModified).TotalSeconds < 1); //this fails - LastModified property isn't updated in DB
}
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://216.121.112.228/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
|