实体框架中的字段最大长度

asp.net-mvc entity-framework

我需要在我的视图上使用ASP.NET MVC和实体框架在我的测试字段上放置最大长度,我找不到如何获取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修饰。您可以通过查看CustomAttributesCollection从PropertyInfo获取ColumnAttribute。需要解析此属性的值以获取长度。我在我的验证器类中这样做,以确保我不会通过使用对我的列太长的字符串来获取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;
    }



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因