0

我有一个由多个系统访问的数据库。我们使用 Fluent Nhibernate 和 Automapping 读取表格。

其中一列是表示枚举的字符串。在大多数安装中这很好,但有时另一个系统会保留一个无效值。如何捕获这些无效值并转换或忽略它们?

例子:

Database Table:
ID  MyEnum
0   "One"
1   "Two"
2   "Invalid"

MyEnum
{
  One,
  Two
}

我已经在使用IAutoMappingOverride我的模型,是否有将函数传递给映射器以进行验证/转换(比如我想将任何未知数转换为MyEnum.One)?或者有没有我想念的更简单的方法?

我要去的地方是结合使用@Firo的答案这里这里的答案

class SafeEnumType<T> : ImmutableUserType where T : struct
{
    public override object NullSafeGet(IDataReader rs, string[] names, object owner)
    {
        T value;
        if (Enum.TryParse((string)rs[names[0]], out value))
            return value;
        else
            return default(T);
    }

    public override void NullSafeSet(IDbCommand cmd, object value, int index)
    {
        NHibernateUtil.String.NullSafeSet(cmd, value.ToString(), index);
    }

    public override Type ReturnedType
    {
        get { return typeof(T); }
    }

    public override SqlType[] SqlTypes
    {
        get { return new[] { SqlTypeFactory.GetString(100) }; }
    }
}

并添加

mapping.Map(x => x.Type).CustomType(typeof(SafeEnumType<EventType>));

给我的AutomapOverride.Override()fn

4

1 回答 1

1

在 NHibernate 中有 IUserType 可以让您定义自定义转换代码。是我的一个基类,您可以使用它,因为枚举是不可变类型

代码

class SpecialEnumUserType : ImmutableUserType
{
    public override object NullSafeGet(IDataReader rs, string[] names, object owner)
    {
        TheSpecialEnum value;
        if (Enum.TryParse<TheSpecialEnum>((string)rs[names[0]], out value))
            return value;
        else
            return default(TheSpecialEnum);
    }

    public override void NullSafeSet(IDbCommand cmd, object value, int index)
    {
        NHibernateUtil.String.NullSafeSet(cmd, value.ToString(), index);
    }

    public override Type ReturnedType
    {
        get { return typeof(TheSpecialEnum); }
    }

    public override SqlType[] SqlTypes
    {
        get { return new[] { SqlTypeFactory.GetString(50) }; }
    }
}

并约定将它们应用于每个枚举属性

class EnumHandlingConvention : IPropertyConvention
{
    public void Apply(IPropertyInstance instance)
    {
        if (instance.Type == typeof(TheSpecialEnum))
        {
            instance.CustomType<SpecialEnumUserType>();
        }
    }
}
于 2013-10-14T05:51:24.300 回答