Short answer: you can't do that without inverse.

Long answer:

When you add a new post to a blog and save the blog, the post doesn't
exist on the DB in that moment, so NH will save it. It will simply
take the post object and insert its contents in the DB and since the
Blog reference is null, exactly this will be inserted. Then the blog
is saved. NH inspects the Posts collection and updates all objects
there with the blog that is currently saved. So the blog reference on
post will be null, but only temporary. After saving is complete, the
FK in't null anymore.

If you use inverse=true, the inverse collection of the blog will not
be processed. You have to set post.Blog explicitly before saving and
therefore no null value will be inserted in the table.

If you can't use inverse=true, you'll have to add a method to add a
member to that collection:

public void AddPost(Post post)
{
  post.Blog = this;
  posts.Add(post);
}

-Markus

2009/12/17 pnewhook <[email protected]>:
> Hello,
>
> I've been following the tutorial to make the simple blog. I'm creating
> mine in ASP.Net, but I've been having trouble creating a post that
> references a Blog instance where I don't use Inverse=true
>
> part of my blog class
>
>    [ActiveRecord]
>    public class Blog : ActiveRecordBase<Blog>
>    {
>        private int id;
>        private string name;
>        private string author;
>        private IList<Post> posts = new List<Post>();
>
>        public Blog()
>        {}
>
>        public Blog(string name, string author)
>        {
>            this.name = name;
>            this.author = author;
>        }
>
>        [HasMany]
>        public IList<Post> Posts
>        {
>            get { return posts; }
>            set { posts = value; }
>        }
>
>        [PrimaryKey (PrimaryKeyType.Identity)]
>        public int Id
>        {
>            get {return id;}
>            set { this.id = value; }
>         }
>
>
>
> part of my post class
>
>    [ActiveRecord]
>    public class Post : ActiveRecordBase<Post>
>    {
>        private int id;
>        private String title;
>        private String contents;
>        private String category;
>        private DateTime created;
>        private int published;
>        private Blog blog;
>
>        public Post()
>        {
>            created = DateTime.Now;
>        }
>
>        [BelongsTo("BlogId")]
>        public Blog Blog
>        {
>            get{return blog;}
>            set {this.blog=value;}
>        }
>
>        [PrimaryKey(PrimaryKeyType.Identity)]
>        public int Id
>        {
>            get { return id; }
>            set { id = value; }
>        }
>
>
> and the default.aspx page that actually does something.
> public partial class _Default : System.Web.UI.Page
> {
>    protected void Page_Load(object sender, EventArgs e)
>    {
>        Person myperson = new Person("name", "password");
>        myperson.Create();
>        Debug.Write("Created Person \n");
>
>        Blog myBlog = new Blog();
>        myBlog.Author = "non inverse";
>        myBlog.Name = "non inverse";
>        myBlog.Create();
>        System.Diagnostics.Debug.Write("Blog Created \n");
>
>        Post myPost = new Post();
>        myPost.Contents = "non inverse";
>        myPost.Title = "non inverse";
>        myPost.Category = "Stuff";
>
>        myPost.Published = 1;
>        myPost.Create();
>
>        myBlog.Posts.Add(myPost);
>        myBlog.Update();
>
>        System.Diagnostics.Debug.Write("Post Created \n");
>
>    }
> }
>
> I get an error on myPost.Create() because it can't insert a null value
> into BlogId. However, I tried calling myBlog.Posts.Add(myPost); before
> creating the post and all the values were still null. What order
> should I do this in.
>
> Everything works for me when I use inverse=true.
>
> Thanks for your help. This is my first ORM and I really like it.
>
> --
>
> 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