No.  You told it to access the field.

access="field.camelcase-underscore"

you actually want..

access="property"

On Jan 5, 6:35 am, epitka <[email protected]> wrote:
> I'll start first with a question: Can a custom type be mapped to a
> backing field so that property exposes a type that is non-custom, yet
> backing field is a custom type? Here is a piece of code to show what I
> mean.
>
>         private Maybe<String> _name;
>         public virtual String Name
>         {
>             get
>             {
>                 return _name.Value;
>
>             }
>             set
>             {
>                 _name = new Maybe<string>(value);
>             }
>         }
>
> As you can see, backing field is of type Maybe<String>, and I have
> created a custom generic user type called MaybeUserType<T>, and mapped
> it like this
>
>   public MaybeTypeMap()
>         {
>             DefaultAccess.CamelCaseField(CamelCasePrefix.Underscore);
>
>             Table("MaybeType");
>             Id(x=>x.Id).GeneratedBy.Native().Access.LowerCaseField
> (Prefix.Underscore);
>
>             Map(x => x.Name).CustomType(typeof(MaybeUserType<String>))
>                 ;
>         }
>
> which generates following mapping
>
> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-
> access="property" auto-import="true" default-cascade="none" default-
> lazy="true">
>   <class xmlns="urn:nhibernate-mapping-2.2" mutable="true"
> name="dnnSphere.NHibernate.Tests.Model.MaybeType,
> dnnSphere.NHibernate.Tests, Version=1.0.0.0, Culture=neutral,
> PublicKeyToken=null" table="MaybeType">
>     <id access="field.lowercase-underscore" name="Id"
> type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral,
> PublicKeyToken=b77a5c561934e089">
>       <column name="Id" />
>       <generator class="native" />
>     </id>
>     <property access="field.camelcase-underscore" name="Name"
> type="dnnSphere.NHibernate.CustomTypes.MaybeUserType`1[[System.String,
> mscorlib, Version=2.0.0.0, Culture=neutral,
> PublicKeyToken=b77a5c561934e089]], dnnSphere.NHibernate,
> Version=1.259.3.0, Culture=neutral, PublicKeyToken=null">
>       <column name="Name" />
>     </property>
>   </class>
> </hibernate-mapping>
>
> However when I run a simple test
>
>   [TestFixture]
>     public class CustomTypeTests : PersistenceFixtureBase
>     {
>
>         [Test]
>         public void Can_Persist_Maybe_Of_Type_String()
>         {
>            MaybeType m = new MaybeType();
>
>             m.Name = "test";
>
>             TransactionalSave(m);
>
>             Session.Clear();
>
>             Session.Refresh(m);
>
>             Assert.IsTrue(m.Name == "Name");
>
>         }
>
>     }
>
> I get an exception that object must implement IConvertible. Why? Why
> is it looking at backing field when persisting? Should it not use a
> property value, which is a "String" type?
>
> NHibernate: INSERT INTO MaybeType (Name) VALUES (@p0); select
> SCOPE_IDENTITY();@p0 = 'dnnSphere.Monads.Maybe`1[System.String]'
>
> System.InvalidCastException: Object must implement IConvertible.
> at System.Convert.ChangeType(Object value, Type conversionType,
> IFormatProvider provider)
> at System.Data.SqlClient.SqlParameter.CoerceValue(Object value,
> MetaType destinationType)
> System.InvalidCastException: Failed to convert parameter value from a
> Maybe`1 to a String.
> at System.Data.SqlClient.SqlParameter.CoerceValue(Object value,
> MetaType destinationType)
> at System.Data.SqlClient.SqlParameter.GetCoercedValue()
> at System.Data.SqlClient.SqlParameter.Validate(Int32 index, Boolean
> isCommandProc)
> at System.Data.SqlClient.SqlCommand.BuildParamList(TdsParser parser,
> SqlParameterCollection parameters)
> at System.Data.SqlClient.SqlCommand.BuildExecuteSql(CommandBehavior
> behavior, String commandText, SqlParameterCollection parameters, ref
> _SqlRPC rpc)
> at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds
> (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean
> returnStream, Boolean async)
> at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior
> cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String
> method, DbAsyncResult result)
> at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior
> cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String
> method)
> at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior
> behavior, String method)
> at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader
> (CommandBehavior behavior)
> at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader()
> at NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd)
> at
> NHibernate.Id.IdentityGenerator.InsertSelectDelegate.ExecuteAndExtract
> (IDbCommand insert, ISessionImplementor session)
> at NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert
> (SqlCommandInfo insertSQL, ISessionImplementor session, IBinder
> binder)
> at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object[]
> fields, Boolean[] notNull, SqlCommandInfo sql, Object obj,
> ISessionImplementor session)
> at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object[]
> fields, Object obj, ISessionImplementor session)
> at NHibernate.Action.EntityIdentityInsertAction.Execute()
> at NHibernate.Engine.ActionQueue.Execute(IExecutable executable)
> at
> NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate
> (Object entity, EntityKey key, IEntityPersister persister, Boolean
> useIdentityColumn, Object anything, IEventSource source, Boolean
> requiresImmediateIdAccess)
> at NHibernate.Event.Default.AbstractSaveEventListener.PerformSave
> (Object entity, Object id, IEntityPersister persister, Boolean
> useIdentityColumn, Object anything, IEventSource source, Boolean
> requiresImmediateIdAccess)
> at
> NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId
> (Object entity, String entityName, Object anything, IEventSource
> source, Boolean requiresImmediateIdAccess)
> at
> NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId
> (SaveOrUpdateEvent event)
> at
> NHibernate.Event.Default.DefaultSaveEventListener.SaveWithGeneratedOrRequestedId
> (SaveOrUpdateEvent event)
> at
> NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient
> (SaveOrUpdateEvent event)
> at
> NHibernate.Event.Default.DefaultSaveEventListener.PerformSaveOrUpdate
> (SaveOrUpdateEvent event)
> at
> NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate
> (SaveOrUpdateEvent event)
> at NHibernate.Impl.SessionImpl.FireSave(SaveOrUpdateEvent event)
> at NHibernate.Impl.SessionImpl.Save(Object obj)
> at
> dnnSphere.MetaTests.PersistenceSpecificationTests.PersistenceFixtureBase.TransactionalSave
> (Object obj) in PersistenceFixtureBase.cs: line 86
> at
> dnnSphere.MetaTests.PersistenceSpecificationTests.CustomTypeTests.Can_Persist_Maybe_Of_Type_String
> () in CustomTypesTests.cs: line 33
-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en.


Reply via email to