Jai*_*han 19 nhibernate fluent-nhibernate
我有以下(简化)
public enum Level
{
Bronze,
Silver,
Gold
}
public class Member
{
public virtual Level MembershipLevel { get; set; }
}
public class MemberMap : ClassMap<Member>
{
Map(x => x.MembershipLevel);
}
Run Code Online (Sandbox Code Playgroud)
这将创建一个表,其中包含名为MembershipLevel的列,其值为Enum字符串值.
我想要的是将整个枚举创建为查找表,其中成员表引用它作为FK的整数值.
另外,我想在不改变模型的情况下这样做.
Lac*_*che 20
要将枚举属性映射为int列,请使用method CustomType.
public class MemberMap : ClassMap<Member>
{
Map( x => x.MembershipLevel ).CustomType<int>();
}
Run Code Online (Sandbox Code Playgroud)
为了使枚举和查找表保持同步,我将查找表和数据添加到您的sql脚本中.集成测试可以验证枚举和查找表值是否相同.
如果您希望SchemaExport创建此表,请为其添加类和映射.
public class MembershipLevel
{
public virtual int Id { get; set; }
public virtual string Code { get; set; }
}
public class MembershipLevelMap : ClassMap<MembershipLevel>
{
Id( x => x.Id );
Map( x => x.Code );
}
Run Code Online (Sandbox Code Playgroud)
如果要使用SchemaExport创建表,则还需要填充它:
foreach (Level l in Enum.GetValues( typeof( Level ))) {
session.Save( new MembershipLevel{ Id = (int) l, Code = l.ToString() });
}
Run Code Online (Sandbox Code Playgroud)
我不这样做是因为你的Enum声明不是动态的,或者更简单,它不会在没有重新编译的情况下改变,而你的查找表可能随时改变.如果枚举和查找表的值不匹配,那么下一步是什么?
另一个原因是如果更改枚举(在代码中),则必须将其与数据库表同步.由于Enums没有增量密钥(PK),因此它们无法如此简单地同步.假设您从代码中删除一个Enum成员并重新编译它,应该发生什么?如果你改变一个值?
我希望我明确反对这种方法.所以我强烈建议存储枚举成员的名称或值.要按名称存储它,只需这样映射:
public class MemberMap : ClassMap<Member>
{
Map(x => x.MembershipLevel, "level")
.CustomType<GenericEnumMapper<Level>>()
.Not.Nullable();
}
Run Code Online (Sandbox Code Playgroud)
要存储这些值,请按@Lachlan在他的回答中发布.
或者,如果您确实需要查找表并希望使用具有严格检查的枚举,请使用PK(或使用此值),KEY和VALUE创建常规模型.使用静态成员创建枚举,并使应用程序在启动时查询数据库中的名称和值.如果事情不匹配,做任何你需要的事情.此外,这并不能保证您的程序在程序运行时不会更改,因此最好确保它不会.
| 归档时间: |
|
| 查看次数: |
4711 次 |
| 最近记录: |