我使用此T4 template为EF4 Code First预生成的视图在构建服务器中不起作用。我不是在构建服务器中重新生成视图,只是编译并运行MSTest。运行测试时抛出错误:
System.Data.MappingException:映射和元数据信息 EntityContainer'DB'不再匹配用于创建的信息 预先生成的视图
我在另一台机器上运行了相同的模板,哈希值不同。我想这就是为什么它在构建服务器中不起作用的原因。其他计算机的哈希值在运行时不同,因此验证失败并抛出异常。
我正在使用:
我正在运行的测试连接到使用代码签入的SQL DB文件。
我已使用相同的EF dll版本和.Net Framework版本检查了构建服务器及其。
知道为什么哈希值不同?
更新 我使用 EdmxWriter.WriteEdmx()生成并比较了来自两台开发机器的两个XML文件。
这是架构版本(两台机器都相同):
<?xml version="1.0" encoding="utf-8"?>
<Edmx Version="2.0" xmlns="http://schemas.microsoft.com/ado/2008/10/edmx">
明显不同的是XML文件中某些节点的顺序。这是一个例子:
机器1:
<EntityType Name="PersonEntity" BaseType="Self.Entity" />
<EntityType Name="CompanyEntity" BaseType="Self.Entity" />
机器2:
<EntityType Name="CompanyEntity" BaseType="Self.Entity" />
<EntityType Name="PersonEntity" BaseType="Self.Entity" />
知道为什么他们的顺序不同吗?
更新2: 来自构建服务器的Edmx(xml)对于其他2 dev机器也是不同的。同样,一些节点的顺序是不同的。
计算机1和构建服务器在%windir%\ Microsoft.NET \ assembly \ GAC_MSIL中都有System.Data.Entity.dll(相同的文件和产品版本 - v4.0.30319.1 ) \ System.Data.Entity的\ v4.0_4.0.0.0__b77a5c561934e089。
更新3: 我还查看了System.Data.Entity.Design.dll的版本。 T4模板引用此程序集。机器1有两个这个dll的副本...在GAC(v4.0.30319.233)和C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.0(v4.0.30319.1) 。在构建服务器和机器2中也是如此。我想知道运行时期间的哈希验证函数是否正在使用此dll,因为它在我的项目中未被引用。如果是,则使用哪个版本。但话说回来,哈希验证在机器1中成功。
答案 0 :(得分:1)
我正在回答我自己的问题。以下是我们如何解决主要问题(如何在EF Code First中预先生成可在不同机器中使用的视图)。我现在使用.Net运行时4.0.30319.17929。
在MyContext.cs所在的ABC.csproject中,删除T4模板和MyContext.Views.cs。
编译ABC.csproject
创建一个可生成视图的控制台应用。我复制了Pawel的大部分T4模板。引用ABC.dll(和其他必需的dll)。这是其中一个变化:
var edmx = GetEdmx(typeof(MyContext));
将GenerateViews()的字符串输出保存到文本文件中。
运行控制台应用。
我觉得我的解决方案很疯狂,必须简化或自动化但是有效。