0

我是由 Entity Framework 5.0 (C# 4.5) 创建的 ORM - 首先是数据库。

我标记为已计算的实体的某些属性(绑定到具有默认值的列)。

如何通过单元测试检查属性标记为在 ORM 模型中计算?

注意:在 ORM 中紧急重建实体后测试控制计算属性的需要。

*.edmx 中的实体描述:

    <EntityType Name="Users">
      <Key>
        <PropertyRef Name="Identifier" />
      </Key>
      <Property Name="Identifier" Type="bigint" Nullable="false" 
                StoreGeneratedPattern="Identity" />
      <Property Name="Name" Type="nvarchar" Nullable="false" MaxLength="32" />
      <Property Name="PasswordHashCode1" Type="int" Nullable="false" />
      <Property Name="PasswordHashCode2" Type="int" Nullable="false" />
      <Property Name="CreateDateTime" Type="datetime2" Nullable="false" 
                StoreGeneratedPattern="Computed" />
    </EntityType>
4

1 回答 1

4

我不确定这是否适用于您的情况 -但如果您想metadata在运行时阅读 -EntityFramework model您可以尝试我之前的帖子中提到的一些事情(并由 OP 进一步改进)...

如何以编程方式读取 EF DbContext 元数据?

这谈到了DbContext(你可以从任何方面使用,所以这也适用于你) - 但具体来说,只是得到ObjectContext- 并从这一点继续......

var container = objectContext.MetadataWorkspace.GetEntityContainer(objectContext.DefaultContainerName, DataSpace.CSpace);

// and just to get you started... 
var baseset = objectContext
    .MetadataWorkspace
    .GetEntityContainer(objectContext.DefaultContainerName, DataSpace.CSpace)
    .BaseEntitySets
    .First(meta => meta.ElementType.Name == "MyBaseClass");

var elementType = objectContext
    .MetadataWorkspace
    .GetEntityContainer(objectContext.DefaultContainerName, DataSpace.CSpace)
    .BaseEntitySets
    .First(meta => meta.ElementType.Name == "MyBaseClass")
    .ElementType;

EdmMember member = elementType.Members[2]; // e.g. 3rd property
Facet item;
if (member.TypeUsage.Facets.TryGetValue("StoreGeneratedPattern", false, out item))
{
    var value = ((StoreGeneratedPattern)item.Value) == StoreGeneratedPattern.Computed;
}

你得到了MetadataWorkspace,你可以从那里开始工作。

我们设法提取了导航属性等 - 但每个属性可能还有一些其他信息 - 比如calculated. 我没有尝试过,但它可能会有所帮助。

此外,我还没有首先在模型或数据库上尝试过这个 - 但我不明白为什么它不应该工作 - 基础设施是相同的(EF,不是代码优先)。

编辑:我添加了一个更具体的代码来帮助您入门(请参阅编辑的代码)。那种工作(让你存储“方面”的位置),它不是现成的代码,需要更多的工作。

于 2013-04-07T20:21:10.210 回答