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

时间:2014-11-19 18:57:18

标签: 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;
}

我该怎么写呢?

更新:我想指出以下答案中提到的IObjectContextAdapater位于System.Data.Entity.Infrastructure命名空间中。

3 个答案:

答案 0 :(得分:9)

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

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

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

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

答案 1 :(得分:2)

它不是很漂亮;在运行时读取edmx属性不是微软容易暴露或记录良好的东西(或者在某些情况下完全记录)。 context是您的DBContext。

var objectContext = ((IObjectContextAdapter)context).ObjectContext;
var entityType = objectContext.MetadataWorkspace.GetItems<EntityType>(DataSpace.CSpace).Where(e => e.Name == "your entity name").First();
var facets = entityType.Properties["your property name"].TypeUsage.Facets;

facets看起来像这样,因此您需要查找MaxLength Name(可能不存在,具体取决于基础字段类型)并获取Value

Count = 5
    [0]: Nullable=false
    [1]: DefaultValue=null
    [2]: MaxLength=250
    [3]: Unicode=false
    [4]: FixedLength=false

答案 2 :(得分:0)

如果修改T4模板,则可以将自己的属性添加到已设置MaxLength的属性中。

如果您可以找到添加它的正确位置,那就很简单:

var lengthAttributeText = edmProperty.MaxLength.HasValue
   ? string.Format("[MaxLength({0})] ", edmProperty.MaxLength.Value)
   : "";

然后将其添加到属性行的文本中。 (由于我已经对.tt文件进行了很多修改,所以棘手的细节会更加棘手;此外,由于缺少对.tt文件的适当IDE支持,这使它比原本要难得多。)