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

本文关键字:ORM 模型 计算 记为 何通过 单元测试 检查 属性 | 更新日期: 2023-09-27 18:08:08

我是用实体框架5.0 (c# 4.5)创建ORM的,首先是数据库。

实体的一些属性被标记为computed(绑定到有默认值的列)。

如何通过单元测试检查属性标记在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>

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

我不确定这是否适用于您的情况- ,但如果您想在运行时从EntityFramework model 中读取metadata,您可以尝试我之前在这里提到的一些事情(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;
}

你得到元数据工作区,你可以从那里往下工作。

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

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

编辑:我添加了一个更具体的代码来让你开始(见编辑的代码)。这种工作(让您找到存储"facet"的地方),它不是现成的代码,需要做更多的工作。