4

我使用此T4 模板为 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 台开发机器也不同。同样,一些节点的顺序是不同的。

机器 1 和构建服务器在 %windir%\Microsoft.NET\assembly\GAC_MSIL\System.Data.Entity\v4.0_4 中都有 System.Data.Entity.dll (相同的文件和产品版本 -- v4.0.30319.1 ) .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 中是成功的。

4

1 回答 1

1

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

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

  2. 编译 ABC.cs 项目

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

    var edmx = GetEdmx(typeof(MyContext));

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

  5. 运行控制台应用程序。

  6. 将名为 MyContext.Views.cs 的新文件添加到 ABC.csproject 并将文本文件的内容复制到此类。
  7. 重新编译 ABC.csproject

我发现我的解决方案很疯狂,必须简化或自动化,但它确实有效。

于 2013-01-15T06:26:27.517 回答