Setting "Insert = false, Update = false" is often one way to hack around a problem in the short term, but unless your requirements actually specify that requirement, I would never do it.
I expect there may be cases where you would want to move a post from one blog to another, in which case, you would conceptually want "Update = true". The solution I gave is the correct long term approach. I'm glad to hear it's working for you! -Michael On Fri, Sep 10, 2010 at 6:51 AM, Laurent ALBAREDE <[email protected]> wrote: > Wow, > It's working with explicit relation in Blog : > [HasMany(typeof(Postc), Table = "Posts", ColumnKey = "post_blogid")] > > Thank you very much Michael and Gauthier ! > > I've tried also this : > [BelongsTo("post_blogid", Insert = false, Update = false)] > public Blog Blog > { > get { return _blog; } > set { _blog = value; } > } > which is working too, but it doesn't seem to be the good approach ?... > > > ________________________________ > De: "Michael Maddox" <[email protected]> > À: [email protected] > Envoyé: Vendredi 10 Septembre 2010 13:45:52 > Objet: Re: OneToMany and CompositeKey > > 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. > > -- > 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.
