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.
