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.