有没有办法使用NHibernate将枚举持久保存到数据库?这是一个包含代码和枚举中每个值的名称的表.
我想保留没有实体的枚举,但仍然有一个从所有其他引用实体到枚举表的外键(枚举的int表示).
在JDK1.5之前的Java中,"Typesafe Enum"模式是实现只能获取有限数量值的类型的常用方法:
public class Suit {
private final String name;
public static final Suit CLUBS =new Suit("clubs");
public static final Suit DIAMONDS =new Suit("diamonds");
public static final Suit HEARTS =new Suit("hearts");
public static final Suit SPADES =new Suit("spades");
private Suit(String name){
this.name =name;
}
public String toString(){
return name;
}
}
Run Code Online (Sandbox Code Playgroud)
(参见例如Bloch的Effective Java的第21项).
现在在JDK1.5 +中,"官方"方式显然是使用enum
:
public enum Suit {
CLUBS("clubs"), DIAMONDS("diamonds"), HEARTS("hearts"), SPADES("spades");
private final String name;
private Suit(String name) {
this.name = name;
}
} …
Run Code Online (Sandbox Code Playgroud) 大多数项目都有某种数据,这些数据在发行版之间基本上是静态的,非常适合用作枚举,如状态,事务类型,错误代码等.例如,我只使用一个公共状态枚举:
public enum Status {
ACTIVE(10, "Active");
EXPIRED(11, "Expired");
/* other statuses... */
/* constructors, getters, etc. */
}
Run Code Online (Sandbox Code Playgroud)
我想知道其他人在这些数据的持久性方面做了些什么.我看到了一些选项,每个选项都有一些明显的优点和缺点:
我的偏好是第二种选择,虽然我的DBA声称我们的最终用户可能想要访问原始数据来生成报告,而不是持久化状态会导致数据模型不完整(反驳:这可以通过文档解决) .
大多数人在这里使用会议吗?人们对每个人的经历是什么,还有其他选择吗?
编辑:
在考虑了一段时间之后,我真正的持久性斗争来自于处理与数据库中的状态相关联的id值.安装应用程序时,这些值将作为默认数据插入.此时,它们具有可用作其他表中的外键的ID.我觉得我的代码需要知道这些ID,以便我可以轻松检索状态对象并将它们分配给其他对象.我该怎么办?我可以添加另一个字段,比如"代码",查看内容,或者只是按名称查找状态,这是icky.
枚举何时分解?
为了支持现有系统中的新功能,我只是考虑对我的数据库模式中的实体表实施某种形式的鉴别器。
为了从做最少的事情开始,为了可读性,我首先在业务实体层决定了一个整数列和一个 C# 枚举。这将提供穷人的多态性,最终可能会发展为实际的多态性,并可能发展为策略模式。
我决定咨询博客圈,因为我从来没有完全习惯使用枚举 - 我想知道,我应该跳过枚举并直接转到结构或类吗?:
首先,我发现了一个断言,即“枚举是邪恶的”,但我觉得这是一种过度概括,并没有直接解决我的用例。
如果我确实要进行枚举,那么会很好地讨论如何通过向枚举添加额外的元数据来扩展我的里程。
接下来,我碰到的吉米·博加德的讨论枚举类和“进一步讨论战略和鉴别NHibernate的”
我应该跳过枚举并直接进入枚举类吗?或者有人对如何向我的域模型添加简单的实体鉴别器有任何其他建议。
更新:
我还要补充一点,NHibernate 和 LINQ to SQL(可能还有所有其他与 ORM 相关的数据访问方法)都使用枚举非常有吸引力,因为它们让您可以在映射中透明地映射鉴别器列。
映射一个枚举类会那么容易吗?
相关问题:
免责声明:
尽管我粗心地使用了术语实体(带有小写的“e”),但我并没有声称在这里讨论 DDD...
我想创建一些自定义数据类型,但我不认为我问的是正确的问题.
.NET中使用了"复合布尔"值,我想设计一些自己的值.我一直在使用一系列布尔变量,它们可以工作,但不一样.
.NET中的示例包括:Color.Black Alignment.Centered [fontProperties] .Bold**我忘记了实际名称,但是你明白了
我想做这样的事情:
ColorSortQualities
一旦声明了,我可以这样做:if(searchOptions.ColorSortQualities == DistinguishColor)[做东西]
这个叫什么?
谢谢!