Why your custom EnumStringType might not be working
I recently spent a couple hours yesterday to fix a problem I was having with my custom EnumStringType (see this post).
Basically, what was happening was when my repository was making a call to ICriteria, which in turn called the Set method of EnumStringType, it was always passing in a lowercase string instead of an enum instance.
For example, when I used a debugger to see what the object value argument was in this method:
/// <summary> /// /// </summary> /// <param name="cmd"></param> /// <param name="value"></param> /// <param name="index"></param> public override void Set(IDbCommand cmd, object value, int index) { var par = (IDataParameter) cmd.Parameters[index]; if (value == null) { par.Value = DBNull.Value; } else { par.Value = Enum.Format(ReturnedClass, value, "G"); } }
… it would show up as an “foo” string instead of a FooEnum.Foo enum object.
What was the problem? It turns out in my repository I was setting on of my criteria like this:
var criteria = Session.CreateCriteria<FooType> .Add( Expression.Eq("EnumField", FooEnum.Foo).IgnoreCase() );
Looks innocuous, does it not? Take a closer look: notice the IgnoreCase() call? That’s what was causing it. It was there because previously I had not been using an enum and I had forgotten to remove it. That little sucker cost me 3 hours of my life.
Hopefully I saved you that time
Comments(1)
You saved another sucker’s life