如何从代码中的EDMX模型中获取字符串的最大长度?

Dan*_*don 6 entity-framework edmx

我从我正在编程的数据库中创建了一个EDMX对象.

我需要从用户那里获得输入并将其保存到数据库表中的一行.问题是我需要将输入字符串的长度限制为数据库中相应VARCHAR列的宽度.

当我浏览模型时,我可以在属性窗口中清楚地看到模型知道字符串的最大长度,但我不知道如何在代码中访问这些数据.

如果我想写这样的东西:

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;
}
Run Code Online (Sandbox Code Playgroud)

我怎么写呢?

更新:我想指出IObjectContextAdapater下面的答案中提到的是在System.Data.Entity.Infrastructure命名空间中.

Ger*_*old 11

以下是两种可以读取元数据的方法:

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);
}
Run Code Online (Sandbox Code Playgroud)

因此,您可以输入表名和属性名,也可以输入指定您感兴趣的属性的表达式.

另一种方法可能是创建一个MetaData类并使用该MaxLength属性.

  • 你应该在那里留下`EntityType`,这是一个EF类. (2认同)