Максимальная длина поля в структуре Entity - PullRequest
23 голосов
/ 14 апреля 2009

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

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

Ответы [ 3 ]

37 голосов
/ 21 апреля 2009

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

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;
    }
3 голосов
/ 14 апреля 2009

Обновление

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...