在运行时获取实体构面和其他元数据

时间:2013-04-09 17:29:13

标签: entity-framework metadata entity-framework-5 ef-model-first facets

我有.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属性工具栏和数据库的元数据的冗余问题和同步问题。

1 个答案:

答案 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属性。

在你的情况下,你应该在那里获得大部分信息 - 但是生成的上面的商店没有填充 - 但在其他一些'空间'我猜(更多的是在其中一个链接上)。

并查看以下链接:

<小时/> Get Model schema to programmatically create database using a provider that doesn't support CreateDatabase
How I can read EF DbContext metadata programmatically?
How check by unit test that properties mark as computed in ORM model?