获取实体方面和运行其他元数据(Get entity facets and other metadat

2019-08-21 01:35发布

我有.NET 4.0 WinForms应用程序,我使用实体框架5模型第一种方法。 在VS EF设计,我创建了一个十几实体有很多的标量属性的String类型,然后在属性工具栏我已经配置参数(即常规参数, 刻面参数)对他们来说,以适应DB要求。

在BL层我能够通过使用以验证实体对象中的目的,以检查它是否包含正确的值,例如DbContext.Entry(Of T)(entity).GetValidationResult()方法。 但我也需要制定的WinForms GUI层输入字段的验证。 我想实现动态GUI验证,基于实体的一组属性的元数据值,以具有BL验证与GUI验证同步,并避免编写的源代码的冗余。

我的问题是:我怎样才能获得元数据值,尤其是微面自动生成实体的元数据值(即固定的长度最大长度可为空 )上运行?

据我所知,存在这样的可能性,以利用基于属性的数据的注释的属性在手动创建的部分类。 然而,在模型优先的办法,这种解决方案可能还包括冗余的问题和同步问题与VS EF设计属性工具栏和数据库的元数据。

Answer 1:

这会帮助你上手,但你需要去调试,特别测试,以得到你所需要的...

一个示例代码...

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模型计算?



文章来源: Get entity facets and other metadata on runtime