實體框架中的字段最大長度

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


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因