C# 如何通过单元测试检查属性标记为ORM模型中计算的属性?
我是由EntityFramework5.0(C#4.5)创建的ORM——首先是数据库 我标记为计算的实体的某些属性(绑定到具有默认值的列) 如何通过单元测试检查属性标记为ORM模型中计算的属性 注意:在ORM中紧急重新创建实体后,测试需要控制计算属性 *.edmx中的实体描述:C# 如何通过单元测试检查属性标记为ORM模型中计算的属性?,c#,entity-framework,unit-testing,entity-framework-5,C#,Entity Framework,Unit Testing,Entity Framework 5,我是由EntityFramework5.0(C#4.5)创建的ORM——首先是数据库 我标记为计算的实体的某些属性(绑定到具有默认值的列) 如何通过单元测试检查属性标记为ORM模型中计算的属性 注意:在ORM中紧急重新创建实体后,测试需要控制计算属性 *.edmx中的实体描述: <EntityType Name="Users"> <Key> <PropertyRef Name="Identifier" /> &l
<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>
我不确定这是否适用于您的案例-但如果您想在运行时阅读
元数据-EntityFramework模型-
中的元数据,您可以尝试我在前面的帖子中提到的一些事情(并通过OP进一步改进)
这涉及到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;
}
你可以从那里开始工作
我们设法提取了导航属性等-但每个属性可能还有一些其他信息-如计算的。我还没试过,但可能会有帮助
此外,我还没有在模型或数据库上尝试过这一点——但我不明白为什么它不应该工作——基础设施是相同的(EF,而不是代码优先)
编辑:我添加了一个更具体的代码,让您开始使用(请参阅编辑的代码)。这种方法很有效(可以将“facet”存储在哪里),它还没有准备好使用代码,需要做更多的工作。我不确定这是否适用于您的情况-但是如果您想在运行时从EntityFramework模型
中读取元数据,您可以尝试我在前面的帖子中提到的一些事情(并通过OP进一步改进)
这涉及到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;
}
你可以从那里开始工作
我们设法提取了导航属性等-但每个属性可能都有一些其他信息-如计算的。我没有尝试过,但可能会有所帮助
此外,我还没有在模型或数据库上尝试过这一点——但我不明白为什么它不应该工作——基础设施是相同的(EF,而不是代码优先)
编辑:我添加了一个更具体的代码来帮助您入门(请参阅编辑的代码)。这种方法很有效(可以让您找到“facet”的存储位置),尚未准备好使用代码,需要做更多的工作。是否要在创建实体后测试计算属性是否具有特定值?否,仅检查属性是否已计算。在早期版本中,EF或Linq2Sql属性似乎由相应的属性标记。在EF 5.0实体中-其简单对象。是否要若要在创建实体后测试计算属性是否具有特定值?否,请仅检查该属性是否已计算。在早期版本中,EF或Linq2Sql属性似乎由相应的属性标记。在EF 5.0实体中-其简单对象。