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.