nhibernate - 枚举到整数的映射导致每次刷新时都会更新

标签 nhibernate fluent-nhibernate

我正在尝试将模型中的枚举属性(System.DayOfWeek 的实例)映射到整数数据库字段。 模型中的其他枚举属性应映射到字符串,因此我不想定义约定。

我知道使用流畅的映射应该可以实现这一点,例如:

Map(x => x.DayOfWeek).CustomType<int>();

事实上,乍一看这似乎有效。

但是,我注意到,每次刷新 session 时,以这种方式映射属性的实体实例都会更新,即使没有对它们进行任何修改。

为了找出导致此刷新的原因,我设置了一个 IPreUpdateEventListener,并检查了实体的 OldState 和 State。 请参阅附图。在 OldState 中,相关对象是一个 int,而在 State 中,相关对象是 DayOfWeek。

如果我使用未指定类型属性的 HBM XML 映射,则不会出现此问题。

所以...

这是 GenericEnumMapper 中的错误或缺点吗? 有没有办法告诉 FNH 映射不要在生成的 HBM 上指定任何类型属性? 如果没有,我可以指定 NH 用于枚举的默认类型(那是什么)吗?

alt text

最佳答案

如果您使用我的枚举约定,则不会遇到这个问题。

public class EnumConvention : IPropertyConvention, IPropertyConventionAcceptance
{
    public void Apply(IPropertyInstance instance)
    {
        instance.CustomType(instance.Property.PropertyType);
    }

    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
        criteria.Expect(x => x.Property.PropertyType == typeof(AddressType)  ||
            x.Property.PropertyType == typeof(Status) ||
            x.Property.PropertyType == typeof(DayOfWeek));
    }
}

然后您可以像常规一样映射您的属性:

Map(x => x.DayOfWeek);

编辑:更新了约定以选择用于 int 转换的特定枚举。此处未检查的所有枚举都将映射为字符串。您可能需要对实际测试的对象进行一些实验。我不确定 propertytype 是否会直接执行此操作。

关于nhibernate - 枚举到整数的映射导致每次刷新时都会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3531937/

相关文章:

nhibernate - 仅使用 NHibernate 保留基类

.net - 如何在新数据库中创建 hibernate_unique_key 表?

join - Fluent NHibernate 连接另一个表中的单列

NHibernate, "On Delete Cascade",级联删除相关表中的行?

nhibernate - 在 Fluent NHibernate 中映射嵌套组件

c# - 带聚合的分页投影 nhibernate 查询的总结果

c# - 有没有办法从查询结果中创建 Dictionary<field_name, field_value> 列表?

mysql - NHibernate 和 mysql 时间戳

c# - (流利的)NHibernate 和 PostgreSQL 9

.net - Fluent NHibernate JoinedSubClass 已过时