Longueur maximale du champ dans le cadre de l'entité

asp.net-mvc entity-framework

Question

Je dois définir une longueur maximale sur mon champ de test sur mes vues avec ASP.NET MVC avec Entity Framework et je ne trouve pas comment obtenir la longueur maximale d'un champ varchar.

Existe-t-il un moyen simple d’obtenir cela, ou toute autre propriété d’un champ de base de données?

Réponse acceptée

Voici comment je parviens à le faire (avec une méthode d'extension sur les entités):

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

Réponse populaire

Mettre à jour

Je me rends compte que cette réponse ne s'applique pas directement à EF. Au moment où j'ai répondu, il n'y avait pas eu de réponse depuis environ 20 minutes et je pensais qu'il serait utile de savoir comment résoudre un problème similaire avec LINQToSQL. Étant donné que le PO utilisait fondamentalement la même technique, mais avec les propriétés EF, cela semble indiquer que j'ai fait le bon choix. Je laisse cette réponse ici pour le contexte et pour ceux qui arrivent ici ayant le même problème mais avec LINQToSQL.

Original

Je ne connais pas EF, mais les propriétés d'entité LINQToSQL sont décorées avec ColumnAttributes. Vous pourrez peut-être obtenir ColumnAttribute à partir de PropertyInfo pour la propriété en consultant CustomOttributesCollection. La valeur de cet attribut devrait être analysée pour la longueur. Je le fais dans mes classes de validation pour m'assurer que je ne vais pas avoir d'erreur SQL en utilisant une chaîne trop longue pour ma colonne.

C'est la méthode que j'utilise pour extraire la longueur de la colonne pour les propriétés de chaîne.

    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

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow