我已经从我编程的数据库中创建了一个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
命名空间中。
答案 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支持,这使它比原本要难得多。)