Hi!

You can implement your own collectiontype and specify it in the
mappings with attribute collection-type.

There is also a option to use dynamic code generators like Castle or
other to dynamically implement on property changed.
See
http://www.codewrecks.com/blog/index.php/2008/08/04/implement-inotifypropertychanged-with-castledynamicproxy/
or
http://ayende.com/Blog/archive/2009/08/07/nhibernate-amp-inotifypropertychanged.aspx

Hope that helps

On 7 Dec, 13:05, Dmitiry Nagirnyak <[email protected]> wrote:
> Somebody please?
> Is this something that nobody knows or I don't provide enough info?
>
> 2009/12/3 Dmitiry Nagirnyak <[email protected]>
>
>
>
> > Anybody?
>
> > 2009/12/2 Dmitiry Nagirnyak <[email protected]>
>
> > Hi,
>
> >> I need to map 2 classes: Blog and Post.
> >> There is an association (blog.Posts-post.BelongsTo) with custom collection
> >> (that supports notification if items were added/removed).
>
> >> Now the questions:
>
> >>    - What modification should be done to map the classes?
> >>    - What XML mapping should look like?
>
> >> The only condition is that the tests below should not be touched and
> >> passing.
>
> >> Thanks a lot.
> >> Dmitriy.
>
> >> The code:
>
> >>     public class Post {
> >>         private Blog belongsTo;
> >>         public virtual Blog BelongsTo {
> >>             get {
> >>                 return belongsTo;
> >>             }
> >>             set {
> >>                 if (value == null) {
> >>                     if (belongsTo != null)
> >>                         belongsTo.Posts.Remove(this);
> >>                 }  else
> >>                     value.Posts.Add(this);
> >>                 belongsTo = value;
> >>             }
> >>         }
> >>     }
>
> >>     public class Blog {
> >>         public Blog() {
> >>             posts = new SubscribableCollection<Post>();
> >>             posts.OnAdded += item => {
> >>                 if (item.BelongsTo != this && item.BelongsTo != null)
> >>                     item.BelongsTo.Posts.Remove(item);
> >>                 item.BelongsTo = this;
> >>             };
> >>             posts.OnRemoved += item => item.BelongsTo = null;
> >>         }
>
> >>         private SubscribableCollection<Post> posts;
> >>         public virtual ICollection<Post> Posts {
> >>             get {
> >>                 return posts;
> >>             }
> >>         }
> >>     }
>
> >>     public class SubscribableCollection<T> : ICollection<T> {
> >>         public event OnItemDelegate<T> OnAdded;
> >>         public event OnItemDelegate<T> OnRemoved;
> >>         // The implementation is stripped, you get what it does
> >>     }
>
> >>     [TestFixture]
> >>     public class OneToMany {
>
> >>         [Test]
> >>         public void Assign() {
> >>             var b = new Blog();
> >>             var p = new Post();
>
> >>             p.BelongsTo = b;
>
> >>             Assert.That(b.Posts.First(), Is.SameAs(p));
> >>         }
>
> >>         [Test]
> >>         public void ReAssign() {
> >>             var b1 = new Blog();
> >>             var b2 = new Blog();
> >>             var p = new Post();
>
> >>             p.BelongsTo = b1;
> >>             p.BelongsTo = b2;
>
> >>             Assert.That(b2.Posts.First(), Is.SameAs(p));
> >>             Assert.That(b1.Posts, Is.Empty);
> >>         }
>
> >>         [Test]
> >>         public void UnAssign() {
> >>             var b = new Blog();
> >>             var p = new Post();
>
> >>             p.BelongsTo = b;
> >>             p.BelongsTo = null;
>
> >>             Assert.That(b.Posts, Is.Empty);
> >>         }
>
> >>         [Test]
> >>         public void AddToList() {
> >>             var b = new Blog();
> >>             var p = new Post();
>
> >>             b.Posts.Add(p);
> >>             Assert.That(p.BelongsTo, Is.SameAs(b));
> >>         }
>
> >>         [Test]
> >>         public void AddDuplicateToList() {
> >>             var b = new Blog();
> >>             var p = new Post();
>
> >>             b.Posts.Add(p);
> >>             b.Posts.Add(p);
> >>             Assert.That(b.Posts.Count, Is.EqualTo(1));
> >>         }
>
> >>         [Test]
> >>         public void MoveToOtherList() {
> >>             var b1 = new Blog();
> >>             var b2 = new Blog();
> >>             var p = new Post();
>
> >>             b1.Posts.Add(p);
> >>             b2.Posts.Add(p);
>
> >>             Assert.That(p.BelongsTo, Is.SameAs(b2));
> >>             Assert.That(b1.Posts, Is.Empty);
> >>             Assert.That(b2.Posts, Is.Not.Empty);
> >>         }
>
> >>         [Test]
> >>         public void RemoveFomList() {
> >>             var b = new Blog();
> >>             var p = new Post();
>
> >>             b.Posts.Add(p);
> >>             b.Posts.Remove(p);
> >>             Assert.That(p.BelongsTo, Is.Null);
> >>         }
> >>     }

--

You received this message because you are subscribed to the Google Groups 
"nhusers" 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/nhusers?hl=en.


Reply via email to