1

我有 .NET 4.0 WinForms 应用程序,并且我使用带有模型优先方法的实体框架 5。在 VS EF 设计器中,我创建了十几个具有大量标量String类型属性的实体,然后在属性工具栏中我为它们配置了参数(即常规参数、Facets参数),以满足数据库要求。

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

我的问题是:如何在运行时获取自动生成实体的元数据值,尤其是方面元数据值(即Fixed LengthMax LengthNullable )?

据我所知,有可能利用基于手动创建的部分类中的属性属性的数据注释。但是,在 Model First 方法中,此解决方案还可能涉及冗余问题和与 VS EF Designer 属性工具栏和数据库中的元数据的同步问题。

4

1 回答 1

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财产。

在您的情况下,您应该在那里提供大多数信息 - 但例如上面生成的商店没有在那里填充 - 但我猜在其他一些“空间”中(更多在其中一个链接中)。

并查看以下链接:


获取模型架构以使用不支持 CreateDatabase 的提供程序以编程方式创建数据库
如何以编程方式读取 EF DbContext 元数据?
如何通过单元测试检查属性标记为在 ORM 模型中计算?

于 2013-04-09T20:26:56.360 回答