Gauthier, Yeah, I did try to use CompositeKeyColumnKeys at first, but that wasn't the correct approach.
I tested the solution I gave and it works. -Michael On Fri, Sep 10, 2010 at 6:42 AM, Gauthier Segay <[email protected]> wrote: > 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. > > -- 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.
