EF4 Code First预生成视图在其他计算机中具有不同的哈希值

时间:2012-10-17 02:49:46

标签: entity-framework ef-code-first t4

我使用此T4 template为EF4 Code First预生成的视图在构建服务器中不起作用。我不是在构建服务器中重新生成视图,只是编译并运行MSTest。运行测试时抛出错误:

  

System.Data.MappingException:映射和元数​​据信息   EntityContainer'DB'不再匹配用于创建的信息   预先生成的视图

我在另一台机器上运行了相同的模板,哈希值不同。我想这就是为什么它在构建服务器中不起作用的原因。其他计算机的哈希值在运行时不同,因此验证失败并抛出异常。

我正在使用:

  • VS 2010 Pro
  • .Net Framework v4.0.30319
  • 实体框架v4.2(代码优先)
  • EF CodeFirst View Generation T4 Template for C#(v1.0.1) - 略微修改了GetEdmxSchemaVersion,为我的设置返回正确的EntityFrameworkVersions版本。
  • 使用类库项目模板

我正在运行的测试连接到使用代码签入的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中成功。

1 个答案:

答案 0 :(得分:1)

我正在回答我自己的问题。以下是我们如何解决主要问题(如何在EF Code First中预先生成可在不同机器中使用的视图)。我现在使用.Net运行时4.0.30319.17929。

  1. 在MyContext.cs所在的ABC.csproject中,删除T4模板和MyContext.Views.cs。

  2. 编译ABC.csproject

  3. 创建一个可生成视图的控制台应用。我复制了Pawel的大部分T4模板。引用ABC.dll(和其他必需的dll)。这是其中一个变化:

    var edmx = GetEdmx(typeof(MyContext));

  4. 将GenerateViews()的字符串输出保存到文本文件中。

  5. 运行控制台应用。

  6. 将名为MyContext.Views.cs的新文件添加到ABC.csproject,并将文本文件的内容复制到此类。
  7. 重新编译ABC.csproject
  8. 我觉得我的解决方案很疯狂,必须简化或自动化但是有效。