Обновление
Я понимаю, что этот ответ не имеет прямого отношения к EF. В то время, когда я отвечал, около 20 минут не было ответов, и я подумал, что знание того, как я решаю подобную проблему с LINQToSQL, может помочь. Учитывая, что OP в основном использовал ту же технику, хотя и со свойствами EF, похоже, указывает на то, что я сделал правильный выбор. Я оставляю этот ответ здесь для контекста и для тех, кто попадает сюда с такой же проблемой, но с LINQToSQL.
Оригинал
Я не знаю о EF, но свойства сущностей LINQToSQL украшены атрибутами ColumnAttributes. Возможно, вы сможете получить ColumnAttribute из PropertyInfo для свойства, посмотрев на CustomAttributesCollection. Значение этого атрибута должно быть проанализировано по длине. Я делаю это в своих классах валидатора, чтобы убедиться, что я не получу ошибку SQL, используя строку, которая слишком длинна для моего столбца.
Это метод, который я использую для извлечения длины столбца для свойств строки.
public static int MaximumPropertyLength( Type type, string propertyName )
{
int maximumLength = -1;
PropertyInfo info = type.GetProperty( propertyName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance );
if (info != null)
{
var attribute = info.GetCustomAttributes( typeof( ColumnAttribute ), false )
.Cast<ColumnAttribute>()
.FirstOrDefault();
if (attribute != null)
{
maximumLength = ExtractLength( attribute.DbType );
}
}
return maximumLength;
}
private static int ExtractLength( string dbType )
{
int max = int.MaxValue;
if (dbType.Contains( "(" ))
{
string[] parts = dbType.Split( new char[] { '(', ')' }, StringSplitOptions.RemoveEmptyEntries );
if (parts.Length > 1)
{
int.TryParse( parts[1], out max );
}
}
return max;
}