From: <jul...@us...> - 2010-11-02 11:59:18
|
Revision: 5259 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5259&view=rev Author: julian-maughan Date: 2010-11-02 11:59:09 +0000 (Tue, 02 Nov 2010) Log Message: ----------- Change to ICompositeUserType.NullSafeSet to cater for cases where not all parameters should be set (such as dynamic-update). Contributed by Patrick Earl (ref. NH-2392) Modified Paths: -------------- trunk/nhibernate/releasenotes.txt trunk/nhibernate/src/NHibernate/Type/CompositeCustomType.cs trunk/nhibernate/src/NHibernate/UserTypes/ICompositeUserType.cs trunk/nhibernate/src/NHibernate.DomainModel/DoubleStringType.cs trunk/nhibernate/src/NHibernate.DomainModel/MultiplicityType.cs trunk/nhibernate/src/NHibernate.DomainModel/NHibernate.DomainModel.csproj trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1763/EmptyStringUserType.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2324/CompositeUserType.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/A.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/PhoneNumber.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/PhoneNumberUserType.cs Modified: trunk/nhibernate/releasenotes.txt =================================================================== --- trunk/nhibernate/releasenotes.txt 2010-11-02 11:48:40 UTC (rev 5258) +++ trunk/nhibernate/releasenotes.txt 2010-11-02 11:59:09 UTC (rev 5259) @@ -2,6 +2,9 @@ ============================= ** Known BREAKING CHANGES from NH2.1.1.GA to NH3.0.0.CR1 + ##### Design time ##### + * [NH-2392] - ICompositeUserType.NullSafeSet method signature changed + ##### Run time ##### * [NH-2199] - null values in maps/dictionaries are no longer silenty ignored/deleted * [NH-1894] - SybaseAnywhereDialect has been removed, and replaced with SybaseASA9Dialect. @@ -15,6 +18,8 @@ Build 3.0.0.CR1 ============================= +** Improvement + * [NH-2392] - ICompositeUserType support for cases where not all parameters should be set (such as dynamic-update) Build 3.0.0.Beta2 (rev5254) ============================= Modified: trunk/nhibernate/src/NHibernate/Type/CompositeCustomType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/CompositeCustomType.cs 2010-11-02 11:48:40 UTC (rev 5258) +++ trunk/nhibernate/src/NHibernate/Type/CompositeCustomType.cs 2010-11-02 11:59:09 UTC (rev 5259) @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Data; +using System.Linq; using System.Reflection; using System.Xml; @@ -11,9 +12,6 @@ namespace NHibernate.Type { - /// <summary> - /// Summary description for CompositeCustomType. - /// </summary> [Serializable] public class CompositeCustomType : AbstractType, IAbstractComponentType { @@ -51,24 +49,16 @@ } } - /// <summary></summary> public virtual IType[] Subtypes { get { return userType.PropertyTypes; } } - /// <summary></summary> public virtual string[] PropertyNames { get { return userType.PropertyNames; } } - /// <summary> - /// - /// </summary> - /// <param name="component"></param> - /// <param name="session"></param> - /// <returns></returns> public virtual object[] GetPropertyValues(object component, ISessionImplementor session) { return GetPropertyValues(component, session.EntityMode); @@ -101,11 +91,6 @@ return userType.GetPropertyValue(component, i); } - /// <summary> - /// - /// </summary> - /// <param name="i"></param> - /// <returns></returns> public virtual CascadeStyle GetCascadeStyle(int i) { return CascadeStyle.None; @@ -121,21 +106,12 @@ get { return false; } } - /// <summary></summary> public override bool IsComponentType { get { return true; } } - /// <summary> - /// - /// </summary> - /// <param name="cached"></param> - /// <param name="session"></param> - /// <param name="owner"></param> - /// <returns></returns> - public override object Assemble(object cached, ISessionImplementor session, - object owner) + public override object Assemble(object cached, ISessionImplementor session, object owner) { return userType.Assemble(cached, session, owner); } @@ -150,11 +126,6 @@ return userType.Disassemble(value, session); } - /// <summary> - /// - /// </summary> - /// <param name="mapping"></param> - /// <returns></returns> public override int GetColumnSpan(IMapping mapping) { IType[] types = userType.PropertyTypes; @@ -166,45 +137,26 @@ return n; } - /// <summary></summary> public override string Name { get { return name; } } - /// <summary></summary> public override System.Type ReturnedClass { get { return userType.ReturnedClass; } } - /// <summary></summary> public override bool IsMutable { get { return userType.IsMutable; } } - /// <summary> - /// - /// </summary> - /// <param name="rs"></param> - /// <param name="name"></param> - /// <param name="session"></param> - /// <param name="owner"></param> - /// <returns></returns> public override object NullSafeGet(IDataReader rs, string name, ISessionImplementor session, object owner) { return userType.NullSafeGet(rs, new string[] {name}, session, owner); } - /// <summary> - /// - /// </summary> - /// <param name="rs"></param> - /// <param name="names"></param> - /// <param name="session"></param> - /// <param name="owner"></param> - /// <returns></returns> public override object NullSafeGet(IDataReader rs, string[] names, ISessionImplementor session, object owner) { return userType.NullSafeGet(rs, names, session, owner); @@ -212,19 +164,15 @@ public override void NullSafeSet(IDbCommand st, object value, int index, bool[] settable, ISessionImplementor session) { - userType.NullSafeSet(st, value, index, session); + userType.NullSafeSet(st, value, index, settable, session); } public override void NullSafeSet(IDbCommand cmd, object value, int index, ISessionImplementor session) { - userType.NullSafeSet(cmd, value, index, session); + bool[] settable = Enumerable.Repeat(true, GetColumnSpan(session.Factory)).ToArray(); + userType.NullSafeSet(cmd, value, index, settable, session); } - /// <summary> - /// - /// </summary> - /// <param name="mapping"></param> - /// <returns></returns> public override SqlType[] SqlTypes(IMapping mapping) { IType[] types = userType.PropertyTypes; @@ -241,12 +189,6 @@ return result; } - /// <summary> - /// - /// </summary> - /// <param name="value"></param> - /// <param name="factory"></param> - /// <returns></returns> public override string ToLoggableString(object value, ISessionFactoryImplementor factory) { return value == null ? "null" : value.ToString(); @@ -277,8 +219,7 @@ get { return null; } } - public override object Replace(object original, object current, ISessionImplementor session, object owner, - IDictionary copiedAlready) + public override object Replace(object original, object current, ISessionImplementor session, object owner, IDictionary copiedAlready) { return userType.Replace(original, current, session, owner); } Modified: trunk/nhibernate/src/NHibernate/UserTypes/ICompositeUserType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/UserTypes/ICompositeUserType.cs 2010-11-02 11:48:40 UTC (rev 5258) +++ trunk/nhibernate/src/NHibernate/UserTypes/ICompositeUserType.cs 2010-11-02 11:59:09 UTC (rev 5259) @@ -9,23 +9,23 @@ /// A UserType that may be dereferenced in a query. /// This interface allows a custom type to define "properties". /// These need not necessarily correspond to physical .NET style properties. - /// - /// A ICompositeUserType may be used in almost every way + /// + /// A ICompositeUserType may be used in almost every way /// that a component may be used. It may even contain many-to-one /// associations. - /// + /// /// Implementors must be immutable and must declare a public /// default constructor. - /// + /// /// Unlike UserType, cacheability does not depend upon - /// serializability. Instead, Assemble() and + /// serializability. Instead, Assemble() and /// Disassemble() provide conversion to/from a cacheable /// representation. /// </summary> public interface ICompositeUserType { /// <summary> - /// Get the "property names" that may be used in a query. + /// Get the "property names" that may be used in a query. /// </summary> string[] PropertyNames { get; } @@ -80,16 +80,18 @@ /// <returns></returns> object NullSafeGet(IDataReader dr, string[] names, ISessionImplementor session, object owner); - /// <summary> - /// Write an instance of the mapped class to a prepared statement. - /// Implementors should handle possibility of null values. - /// A multi-column type should be written to parameters starting from index. - /// </summary> - /// <param name="cmd"></param> - /// <param name="value"></param> - /// <param name="index"></param> - /// <param name="session"></param> - void NullSafeSet(IDbCommand cmd, object value, int index, ISessionImplementor session); + /// <summary> + /// Write an instance of the mapped class to a prepared statement. + /// Implementors should handle possibility of null values. + /// A multi-column type should be written to parameters starting from index. + /// If a property is not settable, skip it and don't increment the index. + /// </summary> + /// <param name="cmd"></param> + /// <param name="value"></param> + /// <param name="index"></param> + /// <param name="settable"></param> + /// <param name="session"></param> + void NullSafeSet(IDbCommand cmd, object value, int index, bool[] settable, ISessionImplementor session); /// <summary> /// Return a deep copy of the persistent state, stopping at entities and at collections. @@ -128,7 +130,7 @@ /// with a new (original) value from the detached entity we are merging. For immutable /// objects, or null values, it is safe to simply return the first parameter. For /// mutable objects, it is safe to return a copy of the first parameter. However, since - /// composite user types often define component values, it might make sense to recursively + /// composite user types often define component values, it might make sense to recursively /// replace component values in the target object. /// </summary> object Replace(object original, object target, ISessionImplementor session, object owner); Modified: trunk/nhibernate/src/NHibernate.DomainModel/DoubleStringType.cs =================================================================== --- trunk/nhibernate/src/NHibernate.DomainModel/DoubleStringType.cs 2010-11-02 11:48:40 UTC (rev 5258) +++ trunk/nhibernate/src/NHibernate.DomainModel/DoubleStringType.cs 2010-11-02 11:59:09 UTC (rev 5259) @@ -58,12 +58,12 @@ } - public void NullSafeSet(IDbCommand st, Object value, int index, ISessionImplementor session) + public void NullSafeSet(IDbCommand st, Object value, int index, bool[] settable, ISessionImplementor session) { string[] strings = (value == null) ? new string[2] : (string[]) value; - NHibernateUtil.String.NullSafeSet(st, strings[0], index, session); - NHibernateUtil.String.NullSafeSet(st, strings[1], index + 1, session); + if (settable[0]) NHibernateUtil.String.NullSafeSet(st, strings[0], index++, session); + if (settable[1]) NHibernateUtil.String.NullSafeSet(st, strings[1], index, session); } public string[] PropertyNames Modified: trunk/nhibernate/src/NHibernate.DomainModel/MultiplicityType.cs =================================================================== --- trunk/nhibernate/src/NHibernate.DomainModel/MultiplicityType.cs 2010-11-02 11:48:40 UTC (rev 5258) +++ trunk/nhibernate/src/NHibernate.DomainModel/MultiplicityType.cs 2010-11-02 11:59:09 UTC (rev 5259) @@ -1,6 +1,6 @@ using System; using System.Data; - +using System.Linq; using NHibernate.Engine; using NHibernate.Type; using NHibernate.UserTypes; @@ -84,7 +84,7 @@ return m; } - public void NullSafeSet(IDbCommand st, Object value, int index, ISessionImplementor session) + public void NullSafeSet(IDbCommand st, Object value, int index, bool[] settable, ISessionImplementor session) { Multiplicity o = (Multiplicity) value; GlarchProxy g; @@ -99,8 +99,8 @@ g = o.glarch; c = o.count; } - NHibernateUtil.Int32.NullSafeSet(st, c, index, session); - NHibernateUtil.Entity(typeof(Glarch)).NullSafeSet(st, g, index + 1, session); + if (settable[0]) NHibernateUtil.Int32.NullSafeSet(st, c, index, session); + NHibernateUtil.Entity(typeof(Glarch)).NullSafeSet(st, g, index + 1, settable.Skip(1).ToArray(), session); } public object DeepCopy(object value) Modified: trunk/nhibernate/src/NHibernate.DomainModel/NHibernate.DomainModel.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.DomainModel/NHibernate.DomainModel.csproj 2010-11-02 11:48:40 UTC (rev 5258) +++ trunk/nhibernate/src/NHibernate.DomainModel/NHibernate.DomainModel.csproj 2010-11-02 11:59:09 UTC (rev 5259) @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="utf-8"?> <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5"> <PropertyGroup> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> @@ -40,6 +40,9 @@ </PropertyGroup> <ItemGroup> <Reference Include="System" /> + <Reference Include="System.Core"> + <RequiredTargetFramework>3.5</RequiredTargetFramework> + </Reference> <Reference Include="System.Data" /> <Reference Include="System.Xml" /> <Reference Include="Iesi.Collections, Version=1.0.1.0, Culture=neutral, PublicKeyToken=aa95f207798dfdb4"> Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1763/EmptyStringUserType.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1763/EmptyStringUserType.cs 2010-11-02 11:48:40 UTC (rev 5258) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1763/EmptyStringUserType.cs 2010-11-02 11:59:09 UTC (rev 5259) @@ -1,12 +1,10 @@ using System; +using System.Data; using NHibernate.Engine; using NHibernate.UserTypes; namespace NHibernate.Test.NHSpecificTest.NH1763 { - /// <summary> - /// Summary description for EmptyStringUserType - /// </summary> [Serializable] public class EmptyStringUserType : ICompositeUserType { @@ -65,18 +63,20 @@ return NHibernateUtil.String.NullSafeGet(rs, names[0], session, owner); } - public void NullSafeSet(System.Data.IDbCommand st, Object value, int index, NHibernate.Engine.ISessionImplementor session) + public void NullSafeSet(System.Data.IDbCommand st, Object value, int index, bool[] settable, NHibernate.Engine.ISessionImplementor session) { - string str = null; - if (value != null) str = value.ToString().Trim(); - if (str == String.Empty) + if (settable[0]) { - str = null; - NHibernateUtil.String.NullSafeSet(st, str, index, session); + string str = null; + if (value != null) str = value.ToString().Trim(); + if (str == String.Empty) + { + str = null; + NHibernateUtil.String.NullSafeSet(st, str, index, session); + } + else + NHibernateUtil.String.NullSafeSet(st, value, index, session); } - else - NHibernateUtil.String.NullSafeSet(st, value, index, session); - } public Object GetPropertyValue(Object component, int property) @@ -86,17 +86,13 @@ public void SetPropertyValue(Object object1, int i, Object object2) { - } - #region ICompositeUserType Members - public int GetHashCode(object x) { return x == null ? typeof(string).GetHashCode() : x.GetHashCode(); - } public object Replace(object original, object target, ISessionImplementor session, object owner) @@ -104,7 +100,6 @@ return DeepCopy(original); } - #endregion } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2324/CompositeUserType.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2324/CompositeUserType.cs 2010-11-02 11:48:40 UTC (rev 5258) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2324/CompositeUserType.cs 2010-11-02 11:59:09 UTC (rev 5259) @@ -23,8 +23,7 @@ { return true; } - else if (x == null || - y == null) + else if (x == null || y == null) { return false; } @@ -42,11 +41,7 @@ { get { - return new[] - { - "DataA", - "DataB" - }; + return new[] { "DataA", "DataB" }; } } @@ -59,10 +54,10 @@ get { return new IType[] - { - NHibernateUtil.DateTime, - NHibernateUtil.DateTime - }; + { + NHibernateUtil.DateTime, + NHibernateUtil.DateTime + }; } } @@ -141,19 +136,20 @@ /// <param name="cmd"></param> /// <param name="value"></param> /// <param name="index"></param> + /// <param name="settable"></param> /// <param name="session"></param> - public void NullSafeSet(IDbCommand cmd, object value, int index, ISessionImplementor session) + public void NullSafeSet(IDbCommand cmd, object value, int index, bool[] settable, ISessionImplementor session) { if (value == null) { - ((IDataParameter) cmd.Parameters[index]).Value = DBNull.Value; - ((IDataParameter) cmd.Parameters[index + 1]).Value = DBNull.Value; + if (settable[0]) ((IDataParameter) cmd.Parameters[index++]).Value = DBNull.Value; + if (settable[1]) ((IDataParameter) cmd.Parameters[index]).Value = DBNull.Value; } else { var data = (CompositeData) value; - NHibernateUtil.DateTime.Set(cmd, data.DataA, index); - NHibernateUtil.DateTime.Set(cmd, data.DataB, index + 1); + if (settable[0]) NHibernateUtil.DateTime.Set(cmd, data.DataA, index++); + if (settable[1]) NHibernateUtil.DateTime.Set(cmd, data.DataB, index); } } Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/A.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/A.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/A.cs 2010-11-02 11:59:09 UTC (rev 5259) @@ -0,0 +1,13 @@ +using System; +using System.Collections; + +namespace NHibernate.Test.NHSpecificTest.NH2392 +{ + public class A + { + public int? Id { get; set; } + public string StringData1 { get; set; } + public PhoneNumber MyPhone { get; set; } + public string StringData2 { get; set; } + } +} Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/Fixture.cs 2010-11-02 11:59:09 UTC (rev 5259) @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NHibernate.Criterion; +using NHibernate.Linq; +using NHibernate.Linq.Functions; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH2392 +{ + [TestFixture] + public class Fixture : BugTestCase + { + protected override void OnTearDown() + { + using (ISession s = sessions.OpenSession()) + { + s.Delete("from A"); + s.Flush(); + } + } + + [Test] + public void CompositeUserTypeSettability() + { + ISession s = OpenSession(); + try + { + s.Save(new A { StringData1 = "first", StringData2 = "second" }); + s.Flush(); + } + finally + { + s.Close(); + } + + s = OpenSession(); + try + { + A a = s.CreateCriteria<A>().List<A>().First(); + a.MyPhone = new PhoneNumber(1, null); + s.Save(a); + s.Flush(); + } + finally + { + s.Close(); + } + + s = OpenSession(); + try + { + A a = s.CreateCriteria<A>().List<A>().First(); + a.MyPhone = new PhoneNumber(1, "555-1234"); + s.Save(a); + s.Flush(); + } + finally + { + s.Close(); + } + } + } +} Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/Mappings.hbm.xml 2010-11-02 11:59:09 UTC (rev 5259) @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernate.Test" namespace="NHibernate.Test.NHSpecificTest.NH2392"> + <class name="A" table="a" lazy="false" optimistic-lock="dirty" dynamic-update="true"> + <id name="Id" column="id" unsaved-value="null"> + <generator class="native" /> + </id> + <property name="StringData1"/> + <property name="MyPhone" type="NHibernate.Test.NHSpecificTest.NH2392.PhoneNumberUserType, NHibernate.Test"> + <column name="MyPhoneCountryCode"/> + <column name="MyPhoneNumber"/> + </property> + <property name="StringData2"/> + </class> +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/PhoneNumber.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/PhoneNumber.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/PhoneNumber.cs 2010-11-02 11:59:09 UTC (rev 5259) @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace NHibernate.Test.NHSpecificTest.NH2392 +{ + public class PhoneNumber + { + public PhoneNumber(int countryCode, string number) + { + CountryCode = countryCode; + Number = number; + } + + public int CountryCode { get; private set; } + public string Number { get; private set; } + } +} Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/PhoneNumberUserType.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/PhoneNumberUserType.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/PhoneNumberUserType.cs 2010-11-02 11:59:09 UTC (rev 5259) @@ -0,0 +1,106 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using NHibernate.Engine; +using NHibernate.Type; +using NHibernate.UserTypes; + +namespace NHibernate.Test.NHSpecificTest.NH2392 +{ + class PhoneNumberUserType : ICompositeUserType + { + public string[] PropertyNames + { + get { return new[] { "CountryCode", "Number" }; } + } + + public IType[] PropertyTypes + { + get { return new[] { NHibernateUtil.Int32, NHibernateUtil.String }; } + } + + public object GetPropertyValue(object component, int property) + { + PhoneNumber phone = (PhoneNumber)component; + + switch (property) + { + case 0: return phone.CountryCode; + case 1: return phone.Number; + default: throw new NotImplementedException(); + } + } + + public void SetPropertyValue(object component, int property, object value) + { + throw new NotImplementedException(); + } + + public System.Type ReturnedClass + { + get { return typeof(PhoneNumber); } + } + + public bool Equals(object x, object y) + { + if (ReferenceEquals(x, null) && ReferenceEquals(y, null)) + return true; + + if (ReferenceEquals(x, null) || ReferenceEquals(y, null)) + return false; + + return x.Equals(y); + } + + public int GetHashCode(object x) + { + return x.GetHashCode(); + } + + public object NullSafeGet(IDataReader dr, string[] names, ISessionImplementor session, object owner) + { + if (dr.IsDBNull(dr.GetOrdinal(names[0]))) + return null; + + return new PhoneNumber( + (int)NHibernateUtil.Int32.NullSafeGet(dr, names[0], session, owner), + (string)NHibernateUtil.String.NullSafeGet(dr, names[1], session, owner)); + } + + public void NullSafeSet(IDbCommand cmd, object value, int index, bool[] settable, ISessionImplementor session) + { + object countryCode = value == null ? null : (int?)((PhoneNumber)value).CountryCode; + object number = value == null ? null : ((PhoneNumber)value).Number; + + if (settable[0]) NHibernateUtil.Int32.NullSafeSet(cmd, countryCode, index++, session); + if (settable[1]) NHibernateUtil.String.NullSafeSet(cmd, number, index, session); + } + + public object DeepCopy(object value) + { + return value; + } + + public bool IsMutable + { + get { return false; } + } + + public object Disassemble(object value, ISessionImplementor session) + { + return value; + } + + public object Assemble(object cached, ISessionImplementor session, object owner) + { + return cached; + } + + public object Replace(object original, object target, ISessionImplementor session, object owner) + { + return original; + } + } +} Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-11-02 11:48:40 UTC (rev 5258) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-11-02 11:59:09 UTC (rev 5259) @@ -536,6 +536,10 @@ <Compile Include="NHSpecificTest\NH2378\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2378\TestEntity.cs" /> <Compile Include="NHSpecificTest\NH2378\TestEntityDto.cs" /> + <Compile Include="NHSpecificTest\NH2392\A.cs" /> + <Compile Include="NHSpecificTest\NH2392\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2392\PhoneNumber.cs" /> + <Compile Include="NHSpecificTest\NH2392\PhoneNumberUserType.cs" /> <Compile Include="PolymorphicGetAndLoad\Domain.cs" /> <Compile Include="PolymorphicGetAndLoad\PolymorphicGetAndLoadTest.cs" /> <Compile Include="TypesTest\CharClass.cs" /> @@ -1827,6 +1831,7 @@ <EmbeddedResource Include="NHSpecificTest\NH1136\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2202\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1869\Mappings.hbm.xml" /> + <EmbeddedResource Include="NHSpecificTest\NH2392\Mappings.hbm.xml" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\NHibernate.ByteCode.Castle\NHibernate.ByteCode.Castle.csproj"> @@ -2691,6 +2696,7 @@ <EmbeddedResource Include="DynamicEntity\Tuplizer\Customer.hbm.xml" /> </ItemGroup> <ItemGroup> + <Folder Include="NHSpecificTest\NH2392" /> <Folder Include="Properties\" /> </ItemGroup> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |