I really don't know, would have to try myself. Are there different
columns for the properties? You probably should try to define a column
name.

On 26 Mrz., 05:19, Joshua <[email protected]> wrote:
> Thanks Stefan.
>
> I'm now able to implement one of the interface properties explicitly,
> but when I add the second I get:
>
> TestCase 'MappingTests.FooTests.Test'
> failed: System.ArgumentOutOfRangeException : Index was out of range.
> Must be non-negative and less than the size of the collection.
> Parameter name: index
>         at System.ThrowHelper.ThrowArgumentOutOfRangeException
> (ExceptionArgument argument, ExceptionResource resource)
>         at System.ThrowHelper.ThrowArgumentOutOfRangeException()
>         at System.Collections.Generic.List`1.get_Item(Int32 index)
>         at System.Data.SQLite.SQLiteParameterCollection.GetParameter(Int32
> index)
>         at
> System.Data.Common.DbParameterCollection.System.Collections.IList.get_Item
> (Int32 index)
>         at NHibernate.Type.AbstractStringType.Set(IDbCommand cmd, Object
> value, Int32 index)
>         at NHibernate.Type.NullableType.NullSafeSet(IDbCommand cmd, Object
> value, Int32 index)
>         at NHibernate.Type.NullableType.NullSafeSet(IDbCommand st, Object
> value, Int32 index, Boolean[] settable, ISessionImplementor session)
>         at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate
> (Object id, Object[] fields, Object rowId, Boolean[] includeProperty,
> Boolean[][] includeColumns, Int32 table, IDbCommand statement,
> ISessionImplementor session, Int32 index)
>         at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate
> (Object id, Object[] fields, Boolean[] includeProperty, Boolean[][]
> includeColumns, Int32 j, IDbCommand st, ISessionImplementor session)
>         at
> NHibernate.Persister.Entity.AbstractEntityPersister.GeneratedIdentifierBinder.BindValues
> (IDbCommand ps)
>         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)
>
> mapping:
>
> <?xml version="1.0" encoding="utf-8" ?>
> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
> assembly="MappingTests" namespace="MappingTests">
>   <class name="ConcreteFoo">
>     <id name="Id">
>       <generator class="identity" />
>     </id>
>     <property name="MappingTests.IFoo1.Foo" />
>     <property name="MappingTests.IFoo2.Foo" />
>   </class>
> </hibernate-mapping>
>
> Appropriate parts of the test:
>
> ConcreteFoo foo = new ConcreteFoo();
> ((IFoo1)foo).Foo = "foo1";
> ((IFoo2)foo).Foo = "foo2";
>
> session.Save(foo);
>
> Any ideas?  I tried against SQL Server as well and got the same
> exception.  This exception looks to me like NHibernate legitimately
> doesn't support explicit interface mapping with the same name.
>
> On Mar 25, 3:27 pm, Stefan Steinegger <[email protected]> wrote:
>
> > I have to admit that I didn't read the whole thread.
>
> > When using reflection, a explicit implementation of a property has the
> > name "InterfaceNamespace.Interface.PropertyName". So you should try
> > this in the mapping file.
>
> > About the design: I also tried explicit interface implementations and
> > removed most of them afterwards. It's kind of awkward, it's not
> > inherited and hard to understand.
>
> > In my point of view it's always best to either declare the properties
> > to be the same, so you have to implement them only once, or use
> > different names.
>
> > On the other hand you are right that explicit interface implementation
> > is a .NET feature that needs to be used sometimes and should be
> > supported by NH.
>
> > On Mar 25, 5:37 pm, Joshua <[email protected]> wrote:
>
> > > Thanks James and TigerShark.
>
> > > I think what I'm hearing from you is that I should just map the two
> > > properties in my entity to appropriately (read differently) named
> > > properties and not implement the interfaces at all?  Correct?
>
> > > Being a newb with DDD and ORM's, do you think you could point me in
> > > the right direction with how to design a DTO solution.  Make whatever
> > > naive assumptions about my situation you need to.  I just need a
> > > starting point, please.
>
> > > Thanks.
>
> > > On Mar 25, 10:00 am, James Gregory <[email protected]> wrote:
>
> > > > I think we all know what you're trying to achieve, it's just not a very 
> > > > good
> > > > idea to do it in an entity. It may not even be possible to do that kind 
> > > > of
> > > > mapping with NHibernate. I don't know because it's never something that 
> > > > I
> > > > would consider doing. If it's some obtuse requirement of a service you 
> > > > have
> > > > no control over, then I'd personally create a DTO that interacts with it
> > > > that implements the appropriate behavior, and map between a properly
> > > > designed model and that DTO. Don't try to bring that mess down into the
> > > > model too.
>
> > > > On Wed, Mar 25, 2009 at 3:55 PM, Joshua <[email protected]> wrote:
>
> > > > > I think my design is so odd to you that I'm going to simplify
> > > > > further.  One major question I have is how to implement explicit
> > > > > interface implementations.  My entity must implement two interfaces
> > > > > with the same name in order to interact with the rest of the domain
> > > > > for which the design is not up to me.  I must persist all of the
> > > > > relevant data.  Here is my updated domain and skeletal mapping.
> > > > > Please recommend how you were persist the "Foo" properties using
> > > > > NHibernate, however seems best to you.
>
> > > > >    public interface IFoo1
> > > > >    {
> > > > >        string Foo
> > > > >        {
> > > > >            get;
> > > > >            set;
> > > > >        }
>
> > > > >    }
>
> > > > >    public interface IFoo2
> > > > >    {
> > > > >        string Foo
> > > > >        {
> > > > >            get;
> > > > >            set;
> > > > >        }
>
> > > > >    }
>
> > > > >    public class ConcreteFoo : IFoo1, IFoo2
> > > > >     {
> > > > >        public virtual int Id
> > > > >        {
> > > > >            get;
> > > > >            set;
> > > > >        }
>
> > > > >         string IFoo1.Foo
> > > > >        {
> > > > >            get;
> > > > >            set;
> > > > >        }
>
> > > > >        string IFoo2.Foo
> > > > >        {
> > > > >            get;
> > > > >            set;
> > > > >         }
> > > > >    }
>
> > > > > <?xml version="1.0" encoding="utf-8" ?>
> > > > > <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
> > > > > assembly="MappingTests" namespace="MappingTests">
> > > > >  <class name="ConcreteFoo">
> > > > >    <id name="Id">
> > > > >      <generator class="identity" />
> > > > >    </id>
> > > > >   </class>
> > > > > </hibernate-mapping>
>
> > > > > [TestFixture]
> > > > >    public class FooTests
> > > > >    {
> > > > >        [Test]
> > > > >        public void Test()
> > > > >        {
> > > > >            Configuration cfg = new Configuration();
> > > > >            cfg = cfg.Configure();
> > > > >            ISessionFactory factory = cfg.BuildSessionFactory();
> > > > >            using (ISession session = factory.OpenSession())
> > > > >            {
> > > > >                new SchemaExport(cfg).Execute(false, true, false,
> > > > > true, session.Connection, null);
>
> > > > >                ConcreteFoo foo = new ConcreteFoo();
> > > > >                 ((IFoo1)foo).Foo = "foo";
>
> > > > >                session.Save(foo);
> > > > >            }
> > > > >        }
> > > > >    }
>
> > > > > Thanks.
--~--~---------~--~----~------------~-------~--~----~
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