当枚举值与字符串值不匹配时,从nHibernate EnumStringType处理异常

isa*_*vis 5 c# nhibernate

我的情况是枚举值作为字符串存储在Db中。检索时,我遇到异常,尝试使用基类为EnumStringType的mytype将字符串转换为枚举。

这是我得到的错误:

NHibernate.HibernateException : Can't Parse Enum4 as MyEnum
Run Code Online (Sandbox Code Playgroud)

例如:来自数据库的值是:“ Enum4”

根据MyEnum的代码,有效的枚举值为:

Enum1 Enum2 Enum3

在代码适应更改之前,以某种方式将Enum4引入到Db中。(我知道发生了疯狂的事情)

异常是正常的,因为我的Enum没有来自数据库的该值。但是我不希望用户得到例外。而是默认为第一个值。(我同意这在某些情况下不行,但是可以防止在我的情况下更为严重的异常)

如果我是对的,则GetInstance是执行从字符串到枚举的转换的方法。是否有某种TryGetXXXX可以解决此问题或如何解决?

谢谢你的时间!

这是我正在解决的Enum代码:

public class EnumMappingBase : EnumStringType
{
    public EnumMappingBase(Type type)
        :base(type)
    { 

    }

    public override object GetInstance(object code)
    {
        return base.GetInstance(code); // Here is where I get the exception. 
        // I am thinking this is where capturing the exception and defaulting must happen. 
        // I wish I had a TryGetInstance() here or may be it is there and I am not aware.
    }

    public override object GetValue(object code)
    {
        return base.GetValue(code);
    }

}

public enum MyEnum
{
    Enum1,
    Enum2,
    Enum3
}

public class MyEnumType : EnumMappingBase
{
    public MyEnumType()
        : base(typeof(MyEnum))
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

kay*_*zam 4

尝试重写 MyEnumType 中的 GetInstance(),如下所示:

public class MyEnumType : EnumMappingBase
{
    public MyEnumType()
        : base(typeof(MyEnum))
    {}

    public override object GetInstance(object code)
    {
        // Set the desired default value
        MyEnum instanceValue = MyEnum.Enum1;
        Enum.TryParse(code, true, out instanceValue);

        return instanceValue;    
    }
}
Run Code Online (Sandbox Code Playgroud)