我有.NET 4.0 WinForms应用程序,我使用实体框架5模型第一种方法。 在VS EF设计,我创建了一个十几实体有很多的标量属性的String
类型,然后在属性工具栏我已经配置参数(即常规参数, 刻面参数)对他们来说,以适应DB要求。
在BL层我能够通过使用以验证实体对象中的目的,以检查它是否包含正确的值,例如DbContext.Entry(Of T)(entity).GetValidationResult()
方法。 但我也需要制定的WinForms GUI层输入字段的验证。 我想实现动态GUI验证,基于实体的一组属性的元数据值,以具有BL验证与GUI验证同步,并避免编写的源代码的冗余。
我的问题是:我怎样才能获得元数据值,尤其是微面自动生成实体的元数据值(即固定的长度 , 最大长度 , 可为空 )上运行?
据我所知,存在这样的可能性,以利用基于属性的数据的注释的属性在手动创建的部分类。 然而,在模型优先的办法,这种解决方案可能还包括冗余的问题和同步问题与VS EF设计属性工具栏和数据库的元数据。
这会帮助你上手,但你需要去调试,特别测试,以得到你所需要的...
一个示例代码...
using (var db = new MyContext())
{
var objectContext = ((IObjectContextAdapter)db).ObjectContext;
var baseset = objectContext
.MetadataWorkspace
.GetEntityContainer(objectContext.DefaultContainerName, DataSpace.CSpace)
.BaseEntitySets
.First(meta => meta.ElementType.Name == "YourEntityClassName");
var elementType = objectContext
.MetadataWorkspace
.GetEntityContainer(objectContext.DefaultContainerName, DataSpace.CSpace)
.BaseEntitySets
.First(meta => meta.ElementType.Name == "YourEntityClassName")
.ElementType;
EdmMember member = elementType.Members[2];
Facet item;
// if (member.TypeUsage.Facets.TryGetValue(EdmProviderManifest.StoreGeneratedPatternFacetName, false, out item))
if (member.TypeUsage.Facets.TryGetValue("StoreGeneratedPattern", false, out item))
{
var value = ((StoreGeneratedPattern)item.Value) == StoreGeneratedPattern.Computed;
}
但是,这只是故事的一部分。
我意识到的是,的工作在某些情况下(此时你需要做一些试验),取决于你所需要的。 但你也有other spaces
在那里-例如SSpace
。 因此,例如用于表名这个工作得更好?
var ssSpaceSet = objectContext.MetadataWorkspace.GetItems<EntityContainer>(DataSpace.SSpace).First()
.BaseEntitySets
.First(meta => meta.ElementType.Name == "YourTableName");
...然后私人Table
财产。
在你的情况,你应该在那里大多数的信息 - 例如,但产生的未填充有上述商店 - 但在其他一些“空间”我想(在这些链接的一个)。
而看看下面的链接:
领型架构以使用不支持的CreateDatabase提供商编程方式创建数据库
我如何编程读取EF的DbContext元?
如何通过单元测试检查性质的符号,ORM模型计算?