因此,我已将现有的 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 更新我的脚手架吗?我没有在其他地方看到任何关于此的常见问题...