Maximale Feldlänge im Entity-Framework

asp.net-mvc entity-framework

Frage

Ich muss in meinen Ansichten mit ASP.NET MVC mit Entity Framework eine maximale Länge für mein Testfeld angeben. Ich kann nicht die maximale Länge eines varchar-Felds ermitteln.

Gibt es eine einfache Möglichkeit, diese oder eine andere Eigenschaft eines Datenbankfelds zu erhalten

Akzeptierte Antwort

So schaffe ich es (mit einer Erweiterungsmethode für Entitäten):

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

Beliebte Antwort

Aktualisieren

Mir ist klar, dass diese Antwort nicht direkt auf EF zutrifft. Zu dem Zeitpunkt, zu dem ich antwortete, gab es seit ungefähr 20 Minuten keine Antworten, und ich dachte, zu wissen, wie ich ein ähnliches Problem mit LINQToSQL gelöst habe, könnte helfen. Angesichts der Tatsache, dass das OP im Grunde dieselbe Technik verwendete, jedoch stattdessen mit EF-Eigenschaften, scheint dies darauf hinzuweisen, dass ich die richtige Wahl getroffen habe. Ich lasse diese Antwort hier für den Kontext und für diejenigen, die hierher kommen, die das gleiche Problem haben, aber mit LINQToSQL.

Original

Ich weiß nichts über EF, aber die Eigenschaften der LINQToSQL-Entität sind mit ColumnAttributes verziert. Sie können möglicherweise das ColumnAttribute aus der PropertyInfo für die Eigenschaft abrufen, indem Sie die CustomAttributesCollection betrachten. Der Wert dieses Attributs müsste nach Länge analysiert werden. Ich mache das in meinen Validator-Klassen, um sicherzustellen, dass ich keinen SQL-Fehler bekomme, indem ich eine Zeichenfolge verwende, die für meine Spalte zu lang ist.

Dies ist die Methode, die ich zum Extrahieren der Spaltenlänge für Zeichenfolgeeigenschaften verwende.

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


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum