How to get the maximum length of a string from an EDMX model in code?

edmx, entity-framework

Solution

Here are two methods by which you can read the meta data:

int? GetMaxLength(DbContext context, string tableName, string propertyName)
{
    var oc = ((IObjectContextAdapter)context).ObjectContext;

    return oc.MetadataWorkspace.GetItems(DataSpace.CSpace).OfType<EntityType>()
             .Where(et => et.Name == tableName)
             .SelectMany(et => et.Properties.Where(p => p.Name == propertyName))
             .Select (p => p.MaxLength)
             .FirstOrDefault();
}

int? GetMaxLength<T>(DbContext context, Expression<Func<T, object>> property)
{
    var memberExpression = (MemberExpression)property.Body;
    string propertyName = memberExpression.Member.Name;
    return GetMaxLength(context, typeof(T).Name, propertyName);
}

So you can either enter the table name and property name, or an expression that specifies the property you're interested in.

Another approach could be to create a MetaData class and use the `MaxLength` attribute.

Problem

I've created an EDMX object from a database I'm programming against. I need to get input from a user and save it to a row in the database table. The problem is that I need to limit the length of input strings to the width of the corresponding VARCHAR column in the database. When I browse the model, I can clearly see in the properties window that the model knows the max length of the string, but I don't know how to access this data in code. If I want to write something like this: ``` Entities entities = new Entities(); myTable = entities.myTable.First(); if (userInput.length > myTable.columnA.MaxLength) { // tell the user that the input is too long. } else { myTable.columnA = userInput; } ``` How do I write it? Update: I would like to point out that the `IObjectContextAdapater` mentioned in the answers below is in the `System.Data.Entity.Infrastructure` namespace.

Original source