我有BidiParent和BidiChildList类,它们将父母和孩子在双向的父子关系中联系起来。如果通过服务层更新子女的父级,则会自动更新新旧父母的子女列表以反映更改。同样,如果通过添加新的子列表来更新父级的子列表,则会自动更改父级的父级和旧的父级的子列表。我想尝试建立一个“智能”领域模型。
很明显,第一个问题是:这是一个好主意吗?
第二个问题是:是否可以告诉NHibernate访问和修改字段_Children或_Parent,但是是否可以将属性子或父级完全视为字段的同义词?NHibernate应该加载和保存内部字段,但是HQL或LINQ查询应该使用公共属性吗?
public class BidiParent<C, P> { ... }
public class BidiChildList<C, P> : IList<C> { ... }
public class Parent {
public string Name { get; set; }
public IList<Child> Children {
get { return ChildrenBidi; }
set { ChildrenBidi.Set(value); }
}
private BidiChildList<Child, Parent> ChildrenBidi {
get { return BidiChildList.Create(this, p => p._Children, c => c._Parent, (c, p) => c._Parent = p); }
}
internal IList<Child> _Children = new List<Child>();
}
public class Child {
public string Name { get; set; }
public Parent Parent {
get { return ParentBidi.Get(); }
set { ParentBidi.Set(value); }
}
private BidiParent<Child, Parent> ParentBidi {
get { return BidiParent.Create(this, p => p._Children, () => _Parent, p => _Parent = p); }
}
internal Parent _Parent = null;
}
[Test]
public void MultilevelConstruction_Succeeds() {
var p = new Parent {
Name = "Bob",
Children = new List<Child> {
new Child { Name = "Kate" },
new Child { Name = "Billy" }
}
};
Assert.AreEqual(2, p.Children.Count);
Assert.AreEqual("Kate", p.Children[0].Name);
Assert.AreEqual("Billy", p.Children[1].Name);
Assert.AreSame(p, p.Children[0].Parent);
Assert.AreSame(p, p.Children[1].Parent);
}发布于 2008-10-12 20:22:09
回答我自己的问题:我需要使用一个命名策略,如文档中所详述的那样。RTFM对吧?
<class name="Parent">
<property name="Name" />
<bag name="Children" access="field.pascalcase-underscore">
<key />
<one-to-many class="Child" />
</bag>
</class>
<class name="Child">
<property name="Name" />
<many-to-one name="Parent" access="field.pascalcase-underscore" />
</class>https://stackoverflow.com/questions/195528
复制相似问题