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.
