Hi Fabio, here is a patch which adds 3 tests where one is currently
failing. Add the failing test i added a short description.

Steve Wagner schrieb:
> Ok i will try it.
> 
> If both SchemaVerify and this are work, i think the following workflow
> could prevent the ghosting.
> 
> * I create a Test which runs SchemaVerify.
> * SchemaVerify tells me that i could run into ghosting with the current
> mapping.
> * I change the mapping with the property
> * SchemaVerify passes
> 
> Fabio Maulo schrieb:
>> 2008/11/13 Steve Wagner <[EMAIL PROTECTED]>
>>
>>>  Wouldn't it here a good suggestion to add an per property option which
>>> forces nhibernate to eval DBNull.Value==default(T) if it dose a dirty
>>> check?
>>>
>> I think we have it working. In meta-data we having DefaultValue exactly for
>> that.mmm wait ... sometimes you are talking about a new feature for existing
>> data where you don't want to change the existing record even if you have a
>> value in the entity and a null in the DB.
>> Do you can create a failing test for the new feature ?
>>
> 
Index: nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
===================================================================
--- nhibernate/src/NHibernate.Test/NHibernate.Test.csproj       (Revision 3887)
+++ nhibernate/src/NHibernate.Test/NHibernate.Test.csproj       (Arbeitskopie)
@@ -375,6 +375,10 @@
     <Compile Include="NHSpecificTest\CollectionFixture.cs" />
     <Compile Include="NHSpecificTest\CriteriaFromHql\Fixture.cs" />
     <Compile Include="NHSpecificTest\CriteriaFromHql\Person.cs" />
+    <Compile Include="NHSpecificTest\Ghosting\Fixture.cs" />
+    <Compile Include="NHSpecificTest\Ghosting\Person.cs" />
+    <Compile Include="NHSpecificTest\Ghosting\PersonPreventGhost.cs" />
+    <Compile Include="NHSpecificTest\Ghosting\PersonWithGhost.cs" />
     <Compile Include="NHSpecificTest\NH1033\Animal.cs" />
     <Compile Include="NHSpecificTest\NH1033\Fixture.cs" />
     <Compile Include="NHSpecificTest\NH1033\Reptile.cs" />
@@ -1515,6 +1519,7 @@
     <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" />
     <EmbeddedResource Include="Deletetransient\Person.hbm.xml" />
     <Content Include="DynamicEntity\package.html" />
+    <EmbeddedResource Include="NHSpecificTest\Ghosting\Mappings.hbm.xml" />
     <EmbeddedResource Include="NHSpecificTest\NH1478\Mappings.hbm.xml" />
     <EmbeddedResource Include="NHSpecificTest\NH1447\Mappings.hbm.xml" />
     <EmbeddedResource Include="TypesTest\EnumCharClass.hbm.xml" />

Eigenschaftsänderungen: nhibernate\src\NHibernate.Test\NHSpecificTest\Ghosting
___________________________________________________________________
Hinzugefügt: bugtraq:url
   + http://jira.nhibernate.org/browse/%BUGID%
Hinzugefügt: bugtraq:logregex
   + NH-\d+


Index: nhibernate/src/NHibernate.Test/NHSpecificTest/Ghosting/Fixture.cs
===================================================================
--- nhibernate/src/NHibernate.Test/NHSpecificTest/Ghosting/Fixture.cs   
(Revision 0)
+++ nhibernate/src/NHibernate.Test/NHSpecificTest/Ghosting/Fixture.cs   
(Revision 0)
@@ -0,0 +1,88 @@
+using NUnit.Framework;
+
+namespace NHibernate.Test.NHSpecificTest.Ghosting
+{
+    [TestFixture]
+    public class Fixture : BugTestCase
+    {
+        protected override void OnSetUp()
+        {
+            Person person = new Person();
+            person.Number = null;
+
+            using (ISession session = OpenSession())
+            using (ITransaction tx = session.BeginTransaction())
+            {
+                session.Save( person );
+                
+                tx.Commit();
+            }
+        }
+
+        protected override void OnTearDown()
+        {
+            using (ISession session = OpenSession())
+            using (ITransaction tx = session.BeginTransaction())
+            {
+                session.Delete( "from Person" );
+                session.Delete( "from PersonWithGhost" );
+                tx.Commit();
+            }
+        }
+
+        [Test]
+        public void PersonWasPersistedCorrectlyAndGeneratesNoGhost()
+        {
+            using (ISession session = OpenSession())
+            using (ITransaction tx = session.BeginTransaction())
+            {
+                var person = session.CreateCriteria( typeof( Person ) )
+                    .SetMaxResults( 1 )
+                    .UniqueResult<Person>();
+
+                Assert.IsNotNull( person );
+                Assert.IsNull( person.Number );
+                Assert.IsFalse( session.IsDirty() );
+            }
+        }
+
+        [Test]
+        public void PersonGeneratesAGhost()
+        {
+            using( ISession session = OpenSession() )
+            using( ITransaction tx = session.BeginTransaction() )
+            {
+                var person = session.CreateCriteria( typeof( PersonWithGhost ) 
)
+                    .SetMaxResults( 1 )
+                    .UniqueResult<PersonWithGhost>();
+
+                Assert.IsNotNull( person );
+                Assert.AreEqual( default( int ), person.Number );
+                Assert.IsTrue( session.IsDirty() );
+            }
+        }
+
+        [Test]
+        public void OptionToPreventTheGenerationOfAGhost()
+        {
+            using( ISession session = OpenSession() )
+            using( ITransaction tx = session.BeginTransaction() )
+            {
+                var person = session.CreateCriteria( typeof( 
PersonPreventGhost ) )
+                    .SetMaxResults( 1 )
+                    .UniqueResult<PersonPreventGhost>();
+
+                Assert.IsNotNull( person );
+                Assert.AreEqual( default( int ), person.Number );
+                Assert.IsFalse( session.IsDirty() );
+
+                /// @Fabio:
+                /// In this object the Number property should have set
+                /// an special flag which forces NHibernate to 
+                /// evaluates default(int) == DBNull.Value
+                /// when it dose the IsDirty check of the Number
+                /// property.
+            }
+        }
+    }
+}
\ No newline at end of file
Index: nhibernate/src/NHibernate.Test/NHSpecificTest/Ghosting/Mappings.hbm.xml
===================================================================
--- nhibernate/src/NHibernate.Test/NHSpecificTest/Ghosting/Mappings.hbm.xml     
(Revision 0)
+++ nhibernate/src/NHibernate.Test/NHSpecificTest/Ghosting/Mappings.hbm.xml     
(Revision 0)
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
+                                  
namespace="NHibernate.Test.NHSpecificTest.Ghosting"
+                                  assembly="NHibernate.Test">
+
+  <class name="Person">
+    <id name="Id">
+      <generator class="native" />
+    </id>
+    <property name="Number" />
+  </class>
+  <class name="PersonWithGhost" table="Person">
+    <id name="Id">
+      <generator class="native" />
+    </id>
+    <property name="Number"  />
+  </class>
+  <class name="PersonPreventGhost" table="Person">
+    <id name="Id">
+      <generator class="native" />
+    </id>
+    <property name="Number" />
+  </class>
+</hibernate-mapping>
Index: nhibernate/src/NHibernate.Test/NHSpecificTest/Ghosting/Person.cs
===================================================================
--- nhibernate/src/NHibernate.Test/NHSpecificTest/Ghosting/Person.cs    
(Revision 0)
+++ nhibernate/src/NHibernate.Test/NHSpecificTest/Ghosting/Person.cs    
(Revision 0)
@@ -0,0 +1,22 @@
+using System.Collections.Generic;
+
+namespace NHibernate.Test.NHSpecificTest.Ghosting
+{
+    public class Person
+    {
+        private int id;
+        private int? _number;
+
+        public virtual int Id
+        {
+            get { return id; }
+            set { id = value; }
+        }
+
+        public virtual int? Number
+        {
+            get { return _number; }
+            set{ _number = value; }
+        }
+    }
+}
\ No newline at end of file
Index: 
nhibernate/src/NHibernate.Test/NHSpecificTest/Ghosting/PersonPreventGhost.cs
===================================================================
--- 
nhibernate/src/NHibernate.Test/NHSpecificTest/Ghosting/PersonPreventGhost.cs    
    (Revision 0)
+++ 
nhibernate/src/NHibernate.Test/NHSpecificTest/Ghosting/PersonPreventGhost.cs    
    (Revision 0)
@@ -0,0 +1,20 @@
+namespace NHibernate.Test.NHSpecificTest.Ghosting
+{
+    public class PersonPreventGhost
+    {
+        private int id;
+        private int _number;
+
+        public virtual int Id
+        {
+            get { return id; }
+            set { id = value; }
+        }
+
+        public virtual int Number
+        {
+            get { return _number; }
+            set { _number = value; }
+        }
+    }
+}
\ No newline at end of file
Index: nhibernate/src/NHibernate.Test/NHSpecificTest/Ghosting/PersonWithGhost.cs
===================================================================
--- nhibernate/src/NHibernate.Test/NHSpecificTest/Ghosting/PersonWithGhost.cs   
(Revision 0)
+++ nhibernate/src/NHibernate.Test/NHSpecificTest/Ghosting/PersonWithGhost.cs   
(Revision 0)
@@ -0,0 +1,20 @@
+namespace NHibernate.Test.NHSpecificTest.Ghosting
+{
+    public class PersonWithGhost
+    {
+        private int id;
+        private int _number;
+
+        public virtual int Id
+        {
+            get { return id; }
+            set { id = value; }
+        }
+
+        public virtual int Number
+        {
+            get { return _number; }
+            set { _number = value; }
+        }
+    }
+}
\ No newline at end of file

Reply via email to