0

因此,我已将现有的 MVC4 项目升级到 .NET4.5 和 EF5。我已经运行了该项目,并且一切正常。然后我尝试运行我的自定义脚手架,它没有给我任何爱。

如果这是一个简单的错误,请原谅我,但我们的模板是由离开公司的人编写的。我已尽力了解这些工作原理并尝试调试它。但是在我的头撞在桌子上一个下午之后,我陷入了死胡同......

我收到的错误消息是 -

Add-ProjectItemViaTemplate : <Path To>\CodeTemplates\Scaffolders\sfRepository\Repository.cs.t4(0,0) : error : Running transformation:  System.InvalidOperationException: Sequence contains no elements    at System.Linq.Enumerable.First[TSource](IEnumerable`1 source)    at Microsoft.VisualStudio.TextTemplatingF690EB8002D6F86A4E8AE00CFB7DAA03C9EB647292D7F28842F3EE3F3550C224E18FB3EC09900009A804CDFD9776A0AFB2AE2497DE3D77DEF417124AC7DE860B.Genera tedTextTransformation.TransformText() At <Path To>\CodeTemplates\Scaffolders\sfRepository\sfRepository.ps1:39 char:1
+ Add-ProjectItemViaTemplate $outputPath -Template Repository -Model @{
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Add-ProjectItemViaTemplate], Exception
    + FullyQualifiedErrorId : T4Scaffolding.Cmdlets.AddProjectItemViaTemplateCmdlet

所以我查看了我的 T4 模板本身。通过消除过程,我发现错误发生在这一行 -

var entity = ItemCollection.GetItems<EntityType>().Where(e => e.Name == Model.EntityName).First();

这是该模板的完整副本-

<#@ template language="C#" HostSpecific="True"  inherits="DynamicTransform" #>
<#@ include file="EF.Utility.CS.ttinclude"#>
<#@ assembly name="System.Data.Entity" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="EnvDTE" #>
<#@ Output Extension="cs" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text.RegularExpressions" #>
<#@ import namespace="EnvDTE" #>
<#@ assembly name="System.ComponentModel.DataAnnotations" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Data.Entity" #>
<#@ assembly name="System.Data.Linq" #>
<#@ import namespace="System" #>
<#@ import namespace="System.ComponentModel.DataAnnotations" #>
<#@ import namespace="System.Data.Linq.Mapping" #>
<#@ import namespace="System.Data.Objects.DataClasses" #>
<#@ import namespace="System.Reflection" #>
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Linq.Expressions;
using System.Web;
using Omu.ValueInjecter;
<# foreach(var ns in new[] { Model.ModelTypeNamespace, Model.DbContextNamespace }.Where(x => !string.IsNullOrEmpty(x) && (x != Model.RepositoryNamespace)).Distinct()) { #>
using <#= ns #>;
<# } #>
using <#=Model.Project#>.DataObjects;

namespace <#=Model.Project#>.Models
{ 
<# 
    var modelType = (CodeType)Model.ModelType; 
    var modelName = modelType.Name; 
    var modelNamePlural = Model.ModelTypePluralized; 
    var primaryKeyProperty = modelType.VisibleMembers().OfType<CodeProperty>().Single(x => x.Name == Model.PrimaryKey);

    CodeGenerationTools code = new CodeGenerationTools(this);
    MetadataLoader loader = new MetadataLoader(this);
    CodeRegion region = new CodeRegion(this, 1);
    MetadataTools ef = new MetadataTools(this);

    // create our item collection from the specified edmx
    EdmItemCollection ItemCollection = loader.CreateEdmItemCollection(Model.InputFileName);

    // find our entity from the pool
    var entity = ItemCollection.GetItems<EntityType>().Where(e => e.Name == Model.EntityName).First();

我试着把 where 拿出来,然后把第一个项目拉出来。集合中仍然没有项目。

尽我所能,EF.Utility.CS.ttinclude 中的 MetadataLoader 出于某种原因无法读取我的 EF5 edmx。

我注意到我的 EF.Utility.CS.ttinclude 本地副本不如“C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\Entity Framework Tools\ Templates\Includes”,所以我尝试将其复制到我的本地项目中。不幸的是,没有任何变化。

我还验证了 Model.InputFileName 保存了 edmx 文件的正确路径。

所以问题是……为什么?我还需要做些什么来为 EF5 和 .NET4.5 更新我的脚手架吗?我没有在其他地方看到任何关于此的常见问题...

4

1 回答 1

1

在这次冒险的第二天,我开始将 EF.Utility.CS.ttinclude 转换为 C# 控制台应用程序,以查看是否无法收集到更好的错误消息。

我注意到文件底部的常量不包括较新的 EF5 命名空间。

我将我的副本与“C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\Entity Framework Tools\Templates\Includes”下的副本进行了比较,果然,我的已经过时了。

在我的调试过程中,我知道我更新了这个(如上所述)。要么我将它复制到错误的文件夹,要么我失去了理智。在这一点上可能是。

无论哪种方式,解决方案都是简单地将我的 EF.Utility.CS.ttinclude 本地副本更新为“C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\Entity Framework Tools \Templates\Includes" 然后它就可以完美地工作了。

感谢所有花时间阅读我的问题的人!

于 2013-08-29T18:46:29.180 回答