首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bidi联想与NHibernate映射

Bidi联想与NHibernate映射
EN

Stack Overflow用户
提问于 2008-10-12 14:10:32
回答 1查看 474关注 0票数 1

我有BidiParent和BidiChildList类,它们将父母和孩子在双向的父子关系中联系起来。如果通过服务层更新子女的父级,则会自动更新新旧父母的子女列表以反映更改。同样,如果通过添加新的子列表来更新父级的子列表,则会自动更改父级的父级和旧的父级的子列表。我想尝试建立一个“智能”领域模型。

很明显,第一个问题是:这是一个好主意吗?

第二个问题是:是否可以告诉NHibernate访问和修改字段_Children或_Parent,但是是否可以将属性子或父级完全视为字段的同义词?NHibernate应该加载和保存内部字段,但是HQL或LINQ查询应该使用公共属性吗?

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

发布于 2008-10-12 20:22:09

回答我自己的问题:我需要使用一个命名策略,如文档中所详述的那样。RTFM对吧?

代码语言:javascript
复制
<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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/195528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档