Entity Frameworkのフィールド最大長

asp.net-mvc entity-framework

質問

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は合法ですか? はい、理由を学ぶ