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.