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