枚举到整数映射,导致每次刷新更新

Ian*_*son 22 nhibernate fluent-nhibernate

我试图将我的模型中的枚举属性(System.DayOfWeek的实例)映射到整数数据库字段.模型中的其他枚举属性应该映射到字符串,所以我不希望定义约定.

我知道这应该可以使用流畅的映射,如:

Map(x => x.DayOfWeek).CustomType<int>();
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

所以...

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

替代文字

mhe*_*xon 23

如果您使用我的枚举惯例,则没有这个问题.

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以像常规一样映射您的财产:

Map(x => x.DayOfWeek);
Run Code Online (Sandbox Code Playgroud)

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


Lui*_*elo 6

我知道我迟到了 - 这个问题已经过去两年了.但是既然我偶然发现了这个问题,我可能会为我解决这个问题:

Map(x => x.DayOfWeek).CustomType<enumType>();
Run Code Online (Sandbox Code Playgroud)

它为我做了诀窍:它每次都停止更新.

来源:https://groups.google.com/forum/#! searchin/ fluent-nhibernate/ enum/ fluent- nhibernate/ bBXlDRvphDw/AFnYs9ei7O0J