升级到.NET4.5和EF5后,Scaffolder无法加载EDMX元数据

时间:2013-08-29 02:23:19

标签: entity-framework asp.net-mvc-4 entity-framework-5 t4 asp.net-4.5

所以我将现有的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脚手架吗?我没有看到其他任何关于此问题的常见问题......

1 个答案:

答案 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 \下的那个”实体框架工具\模板\包含“然后它可以很好地工作。

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