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.

Reply via email to