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

时间:2009-04-14 19:09:44

标签: asp.net-mvc entity-framework

我需要在我的视图中使用带有实体框架的ASP.NET MVC在我的测试字段上放置最大长度,我找不到如何获取varchar字段的最大长度。

是否有一种简单的方法可以获得它或数据库字段的任何其他属性

3 个答案:

答案 0 :(得分:37)

以下是我设法做到的方法(使用实体的扩展方法):

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

答案 1 :(得分:3)

<强>更新

我意识到这个答案并不直接适用于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;
    }

答案 2 :(得分:1)

对于EntityFramework,您需要使用代码生成器或T4模板将自己的自定义属性添加到类中。

然后上面说的tvanfosson会成立。 EF默认情况下不会保留此信息。

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

解释我正在讨论的代码生成器的更多内容。这是非常光滑的我完全按照你之前提到的,问题是专有代码所以我没有你的例子。