tumtumtum/Shaolinq

Add a fallback for Column recommended lenght for enum fields

asizikov opened this issue · 1 comments

When I have a DataAcsessObject with enum property, and property has no values defined:

   [DataAccessObject]
   public abstract class DbType : DataAccessObject<Guid>
   {
        [PersistedMember]
        public abstract Enum? EnumMember { get; set; }
   }

    public enum Enum
    {
            // No values defined here!
    }

Shaolinq is trying to guess the size of the column and fails with the following exception:

XXX : System.Reflection.TargetInvocationException : Exception has been thrown by the target of an invocation.
  ----> System.InvalidOperationException : Sequence contains no elements
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes, StackCrawlMark& stackMark)
   at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
   at System.Activator.CreateInstance(Type type, Object[] args)
   at Shaolinq.Persistence.DefaultSqlDataTypeProvider.GetEnumDataType(Type type)
   at Shaolinq.Persistence.DefaultSqlDataTypeProvider.GetSqlDataType(Type type)
   at Shaolinq.Persistence.Linq.SqlDataDefinitionExpressionBuilder.BuildColumnDefinition(ColumnInfo columnInfo)
   at Shaolinq.Persistence.Linq.SqlDataDefinitionExpressionBuilder.BuildCreateTableExpression(TypeDescriptor typeDescriptor)
   at Shaolinq.Persistence.Linq.SqlDataDefinitionExpressionBuilder.Build()
   at Shaolinq.Persistence.SqlDatabaseSchemaManager.BuildDataDefinitonExpressions(DatabaseCreationOptions options)
   at Shaolinq.Persistence.SqlDatabaseSchemaManager.CreateDatabaseAndSchema(DatabaseCreationOptions options)
   at Shaolinq.DataAccessModel.Create(DatabaseCreationOptions options)
   at Namespace.Class.MethodName() in path/to/class.cs:line 34
--InvalidOperationException
   at System.Linq.Enumerable.Max(IEnumerable`1 source)
   at Shaolinq.Persistence.DefaultStringEnumSqlDataType`1.GetRecommendedLength(Type enumType)
   at Shaolinq.Persistence.DefaultStringEnumSqlDataType`1.CreateConstraintDefaults(ConstraintDefaultsConfiguration defaultsConfiguration, Type type)
   at Shaolinq.Persistence.DefaultStringEnumSqlDataType`1..ctor(ConstraintDefaultsConfiguration constraintDefaultsConfiguration)

That would be nice to have a more descriptive error message here, or use a fallback value for RecommendedLength.

Fixed in latest.