oops got things mixed a bit, you would use what I point if Blog had a
composite key

I think Michael is right

On Sep 10, 1:40 pm, Gauthier Segay <[email protected]> wrote:
> Hello Laurent, I don't have sample at hand, but I'm pretty sure you
> need to give primary key columns in a property of HasManyAttribute on
> Blog.Posts property
>
> Can you look around this:
>
> http://api.castleproject.org/html/P_Castle_ActiveRecord_HasManyAttrib...
>
> the column order matters here.
>
> Hope this helps
>
> On Sep 10, 10:29 am, Laurent Albarède <[email protected]>
> wrote:
>
>
>
>
>
>
>
> > Hi,
> > I'm a new user of ActiveRecord, changing my ORM from Gentle to
> > NHibernate because of client request and upgrade to an alive ORM.
> > In my database, I've got many foreign keys and composite keys.
> > To do simple, I will describe my problem with Blog and Posts sample :
>
> > --------------------------------------------------------------------------- 
> > --------------------------------------------
> > Database
> > --------------------------------------------------------------------------- 
> > --------------------------------------------
> > Blog contains fields :
> > blog_id (PrimaryKey, with a sequence)
> > blog_name
>
> > Post contains fields :
> > post_title
> > post_blogid
>
> > post_blogid is a foreign key to Blog.blog_id.
> > post_title and post_blogid are the composite Primarykey.
>
> > Well, now I've made class in my .Net 3.5 project :
>
> > A Blog class, which contains :
> > -the primary key with sequence (this is working)
> > -an IList of posts
> > -a relation HasMany to posts
>
> > A Postc Class which contains :
> > - A compositekey mapped to attributes in database
> > - my foreign key with BelongsTo attribute
> > -a constructeur which sets the key properly (I think ?...)
>
> > (I have also a Post class with a simple primarykey (post_id) with a
> > sequence. In this case, everythin seems to work.)
>
> > Now I do :
> >             Blog b = new Blog("MyBlog");
> >             b.Create();
> >             Postc p = new Postc(b, "myfirstpost");
> >             p.Create();
>
> > And I obtain this error :
> > ArgumentOutOfRangeException
> > Index out of limits (translation from french, not the exact message).
> >    à
> > System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument
> > argument, ExceptionResource resource)
> >    à System.ThrowHelper.ThrowArgumentOutOfRangeException()
> >    à System.Collections.Generic.List`1.get_Item(Int32 index)
> >    à Npgsql.NpgsqlParameterCollection.get_Item(Int32 index) dans C:
> > \projects\Npgsql2\src\Npgsql\NpgsqlParameterCollection.cs:ligne 117
> >    à Npgsql.NpgsqlParameterCollection.GetParameter(Int32 index) dans C:
> > \projects\Npgsql2\src\Npgsql\NpgsqlParameterCollection.cs:ligne 494
> >    à
> > System.Data.Common.DbParameterCollection.System.Collections.IList.get_Item( 
> > Int32
> > index)
> >    à NHibernate.Type.Int32Type.Set(IDbCommand rs, Object value, Int32
> > index)
> >    à NHibernate.Type.NullableType.NullSafeSet(IDbCommand cmd, Object
> > value, Int32 index)
> >    à NHibernate.Type.NullableType.NullSafeSet(IDbCommand st, Object
> > value, Int32 index, ISessionImplementor session)
> >    à NHibernate.Type.ComponentType.NullSafeSet(IDbCommand st, Object
> > value, Int32 begin, ISessionImplementor session)
> >    à
> > NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object
> > id, Object[] fields, Object rowId, Boolean[] includeProperty, Boolean[]
> > [] includeColumns, Int32 table, IDbCommand statement,
> > ISessionImplementor session, Int32 index)
> >    à NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object
> > id, Object[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql,
> > Object obj, ISessionImplementor session)
>
> > If someone have an idea of what's happening... thank you very much!
>
> > --------------------------------------------------------------------------- 
> > --------------------------------------------
> > Blog Class
> > --------------------------------------------------------------------------- 
> > --------------------------------------------
> >     [ActiveRecord("Blogs")]
> >     public class Blog : ActiveRecordBase
> >     {
> >         private int _id;
> >         private String _name;
> >         private IList _posts;
>
> >         public Blog()
> >         {
> >         }
>
> >         public Blog(String name)
> >         {
> >             _name = name;
> >         }
>
> > [PrimaryKey(PrimaryKeyType.Sequence,"blog_id",SequenceName=("blogs_blog_id_ 
> > seq"))]
> >         public int Id
> >         {
> >             get { return _id; }
> >             set { _id = value; }
> >         }
>
> >         [Property("blog_name")]
> >         public String Name
> >         {
> >             get { return _name; }
> >             set { _name = value; }
> >         }
>
> >         [HasMany(typeof(Postc))]
> >         public IList Posts
> >         {
> >             get { return _posts; }
> >             set { _posts = value; }
> >         }
>
> >         public static void DeleteAll()
> >         {
> >             DeleteAll(typeof(Blog));
> >         }
>
> >         public static Blog[] FindAll()
> >         {
> >             return (Blog[])FindAll(typeof(Blog));
> >         }
>
> >         public static Blog Find(int id)
> >         {
> >             return (Blog)FindByPrimaryKey(typeof(Blog), id);
> >         }
> >     }
>
> > --------------------------------------------------------------------------- 
> > --------------------------------------------
> > Posts Class
> > --------------------------------------------------------------------------- 
> > --------------------------------------------
> >    [ActiveRecord("Posts")]
> >     public class Postc : ActiveRecordBase
> >     {
> >         private PostKey _key;
> >         private Blog _blog;
>
> >         public Postc()
> >         {
> >         }
>
> >         public Postc(Blog blog, String title)
> >             : this()
> >         {
> >             _blog = blog;
> >             _key = new PostKey(title, blog.Id);
>
> >         }
>
> >         [CompositeKey]
> >         public PostKey Key
> >         {
> >             get { return _key; }
> >             set { _key = value; }
> >         }
>
> >         [BelongsTo("post_blogid")]
> >         public Blog Blog
> >         {
> >             get { return _blog; }
> >             set { _blog = value; }
> >         }
>
> >     }
>
> >     [Serializable]
> >     public class PostKey
> >     {
> >         private string _title;
> >         private int _blogid;
>
> >         [KeyProperty(Column="post_title")]
> >         public string Title
> >         {
> >             get { return _title; }
> >             set { _title = value; }
> >         }
>
> >         [KeyProperty(Column = "post_blogid")]
> >         public int BlogId
> >         {
> >             get { return _blogid; }
> >             set { _blogid = value; }
> >         }
>
> >         public PostKey()
> >         {
> >         }
>
> >         public PostKey(string title,int blogid)
> >         {
> >             _title = title;
> >             _blogid = blogid;
> >         }
>
> >         public override int GetHashCode()
> >         {
> >             return _title.GetHashCode() ^ _blogid;
> >         }
>
> >         public override bool Equals(object obj)
> >         {
> >             if (this == obj)
> >             {
> >                 return true;
> >             }
> >             PostKey key = obj as PostKey;
> >             if (key == null)
> >             {
> >                 return false;
> >             }
> >             if (_title != key.Title || _blogid != key.BlogId)
> >             {
> >                 return false;
> >             }
> >             return true;
> >         }
> >     }

-- 
You received this message because you are subscribed to the Google Groups 
"Castle Project Users" 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/castle-project-users?hl=en.

Reply via email to