Подтвердить что ты не робот

Максимальная длина поля в структуре Entity

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

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

4b9b3361

Ответ 1

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

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;
    }

Ответ 2

Обновление

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

Ответ 3

Для EntityFramework вам нужно будет добавить свои собственные атрибуты к классам с помощью генератора кода или шаблона T4.

Тогда то, что сказал вышеупомянутый тванфоссон. EF по умолчанию не сохраняет эту информацию.

http://blogs.msdn.com/adonet/archive/2008/01/24/customizing-code-generation-in-the-ado-net-entity-designer.aspx

Объясняет больше, что я говорю с генератором кода. Это довольно пятно. Я сделал то, о чем вы уже упоминали, проблема связана с проприетарным кодом, поэтому у меня нет примера для вас.