我是由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>
答案 0 :(得分:4)
我不确定这是否适用于您的情况 - 但是如果您想在运行时阅读metadata
- 来自EntityFramework model
,您可以尝试在我之前的帖子中提到的一些事情(并由OP进一步改进)......
How I can read EF DbContext metadata programmatically?
谈到DbContext
(你可以从任何一方工作,这也适用于你) - 但具体来说,只需获得ObjectContext
- 并从这一点继续...... < / p>
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,而不是代码优先)。
编辑:我添加了一个更具体的代码来帮助您入门(请参阅已编辑的代码)。这样的工作(让您了解存储的方面),它不是现成的代码,需要做更多的工作。