我有.NET 4.0 WinForms应用程序,我使用Entity Framework 5和Model First Approach。在VS EF Designer中,我创建了十几个具有String
类型标量属性的实体,然后在属性工具栏中我配置了参数(即常规参数,它们的方面参数),以满足数据库要求。
在BL层中,我能够有效地验证实体对象,以检查它是否包含正确的值,例如使用DbContext.Entry(Of T)(entity).GetValidationResult()
方法。但我需要为WinForms开发GUI层输入字段验证。我想基于实体集属性的元数据值实现动态GUI验证,以使BL验证与GUI验证同步,并避免编写源代码的冗余。
我的问题是:如何获取元数据值,尤其是facets元数据值(即固定长度,最大长度, Nullable )运行时自动生成的实体?
据我所知,有可能在手动创建的分部类中利用基于属性属性的数据注释。但是,在Model First方法中,此解决方案还可能涉及来自VS EF Designer属性工具栏和数据库的元数据的冗余问题和同步问题。
答案 0 :(得分:2)
这应该可以帮助您入门,但是您需要专门进行调试和测试以获得所需内容...
示例代码......
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
属性。
在你的情况下,你应该在那里获得大部分信息 - 但是生成的上面的商店没有填充 - 但在其他一些'空间'我猜(更多的是在其中一个链接上)。
并查看以下链接: