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.
