所以我将现有的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();
我试着把它拿出来,然后拉第一个项目。该系列中仍然没有任何物品。
最好我可以说,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”中那样新。框架工具\模板\包括“所以我尝试将其复制到我的本地项目。不幸的是没有变化。
我还验证了Model.InputFileName保存了edmx文件的正确路径。
所以问题是......为什么?我需要做些什么来更新我的EF5和.NET4.5脚手架吗?我没有看到其他任何关于此问题的常见问题......
答案 0 :(得分: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 \下的那个”实体框架工具\模板\包含“然后它可以很好地工作。
感谢所有花时间阅读我的问题的人!