Максимальная длина поля в Entity Framework

asp.net-mvc entity-framework

Вопрос

Мне нужно указать максимальную длину моего тестового поля в Моих представлениях, используя ASP.NET MVC с Entity Framework, и я не могу найти, как получить максимальную длину поля varchar.

Есть ли простой способ получить это, или любое другое свойство поля базы данных

Принятый ответ

Вот как мне удается это сделать (с помощью метода расширения для сущностей):

public static int? GetMaxLength(this EntityObject entite, string nomPropriete)
    {
        int? result = null;
        using (XEntities contexte = XEntities.GetCurrentContext())
        {
            var queryResult = from meta in contexte.MetadataWorkspace.GetItems(DataSpace.CSpace)
                               .Where(m => m.BuiltInTypeKind == BuiltInTypeKind.EntityType)
                              from p in (meta as EntityType).Properties
                                 .Where(p => p.DeclaringType.Name == entite.GetType().Name
                                     && p.Name == nomPropriete
                                     && p.TypeUsage.EdmType.Name == "String")
                              select p.TypeUsage.Facets["MaxLength"].Value;
            if (queryResult.Count() > 0)
            {
                result = Convert.ToInt32(queryResult.First());
            }
        }
        return result;
    }

Популярные ответы

Обновить

Я понимаю, что этот ответ не имеет прямого отношения к 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;
    }


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow