![]() |
1
1
就我个人而言,我会创建一个像Yassir这样的角色班。 但是,如果您想使用当前的结构,那么创建一个视图,其中包含人员表的外键和角色描述。 修改集合映射表以指向新视图 然后修改角色映射,使其成为属性而不是多对一映射。
编辑:
更新您可以添加的角色
|
![]() |
2
2
实际上,你不会得到你希望的答案,仅仅是因为这是不可能的。(n)Hibernate是一个对象关系映射框架和支持 three kinds of mapping 策略:
它还允许您使用
解决方案?
其实很简单。您不想将类用于
让我们检查一下选项2:
映射可以如预期的那样。结果:您没有违反每个类一个表规则( 编辑:asker说他明确想违反这个规则,hib支持,这是正确的。 ,但是通过使用典型的面向对象技术,您已经隐藏了对象以防修改和访问。所有NH功能(级联等)仍按预期工作。 (n)Hibernate就是关于这种类型的决策:如何在不牺牲清晰性、简洁性或可维护性或违反OO或ORM规则的情况下,对数据库进行一个经过深思熟虑的安全抽象层。 更新(Q.关闭后)在处理此类问题时,我经常使用的其他优秀方法有:
虽然可以直接用NHibernate来做这个,但在我有时间看之前Q.已经关闭了(没有人出错,我只是没有时间)。如果我有时间通过HibernateHBM映射进行更新,即使我不同意这种方法。当最终结果对其他程序员来说不太清楚,总体上也不太清楚时,与hib的高级概念作斗争是不好的(那张表去哪儿了?为什么该表没有IDAO抽象?也见 NHibernate Best Practices 和 S#arp )不过,这个练习还是很有趣的。
考虑到对“最佳实践”的评论:在典型情况下,它不仅应该是“每个表一个类”,而且应该是每个表一个IDAOXXX、一个DAOC具体XXX和一个GetDAOXXX,在这些表中,您可以使用类/接口层次结构来区分只读表和读/写表。每个表至少有四个类/行代码。这通常是自动生成的,但为数据层(DAL)提供了非常清晰的访问层(DAO)。数据层尽可能简单。这些“最佳实践”都不能阻止您使用扩展方法或部分方法来移动
这些都是最好的 一般的 实践。在某些特殊或典型的情况下,这并不总是可能的、可行的,甚至是必要的。 |
![]() |
3
1
如果我是你,我不可能把多对一映射到一个原始类型,我会在模型中添加一个角色类。 |
![]() |
4
0
这是整个OO清教徒的最大转折点。 当然,目标是有一个有效的应用程序。不是完美的类层次结构的somebody版本。所以,如果您必须对“probject.role.name”而不是“probject.role”进行编码,该怎么办?这有助于你制定更可靠的计划吗? 从应用程序设计纯粹主义的角度来看,你想要的只是一个明显的错误。一个人可以有几个角色,一个角色通常可以分配给几个人。 当取消定义的数据模型为每人多个角色时,为什么要花这么多的时间来强制一个不切实际的每人一个角色的类层次结构呢? 如果您真的有一个“每个人只有一个角色”规则,那么它应该在底层数据模型中被反射。 |