T4 -实体框架错误:方法未找到:'System.Data.Entity.DbSet ' 1

本文关键字:System Data DbSet Entity 框架 实体 错误 方法 T4 | 更新日期: 2023-09-27 18:01:41

尝试创建一个相当简单的T4,我试图加载一些值,我可以稍后使用:

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="c:'users'<username>'documents'visual studio 2015'Projects'2_DataModelGenerator'packages'EntityFramework.6.1.3'lib'net45'EntityFramework.dll" #>
<#@ assembly name="c:'users'<username>'documents'visual studio 2015'Projects'2_DataModelGenerator'packages'EntityFramework.6.1.3'lib'net45'EntityFramework.SqlServer.dll" #>
<#@ assembly name="c:'users'<username>'documents'visual studio 2015'Projects'2_DataModelGenerator'2_Data'bin'Debug'2_Data.dll" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Data" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="2_Data" #>
<#@ output extension=".cs" #>
<#
    DevEntities dbContext = new DevEntities();
            var labelClassNames = (from sd in dbContext.tblDatas
                                   where sd.SID == 155
                                   select new
                                   {
                                       SID = sd.SID.ToString(),
                                       SValue = sd.SValue.ToString()
                                   }).ToList();
#>

当我保存T4时,我得到这个错误:

Error Running transformation: System。MissingMethodException:方法not found: 'System.Data.Entity.DbSet ' 1<2_Data.tblData>2 _data.deventities.get_tbldatas () '

我已经在另一个解决方案中测试了这段代码(使用EF 6.1.3),它的工作没有问题(将数据加载到var labelClassNames)。似乎只有在T4模板中才有问题。

是否需要导入另一个命名空间?我不知道我错过了什么!

更新:

在我的TT代码中:
        dbc context = new dbc();
        DevEntities mdc = new DevEntities();
        mdc = context.returnContext();

在我的类库中添加一个类:

public class dbc
{
    private DevEntities dbContext;
    public dbc()
    {
        dbContext = new DevEntities();
    }
    public DevEntities returnContext()
    {
        return dbContext;
    }
}

与之前相同的错误:

正在运行的转换:系统。MissingMethodException:方法不是发现:"System.Data.Entity.DbSet

然而,当我调试t4模板时,我得到一个不同的消息:

没有名为'DevEntities'的连接字符串应用程序配置文件

但是,我已经从包含。edmx文件的类库中复制了App.config文件到包含。tt文件的项目中

任何想法?

T4 -实体框架错误:方法未找到:'System.Data.Entity.DbSet ' 1

T4模板同一项目中的类是不可见的,为了简化其调试,下面一步一步地介绍如何在EntityFramework中顺利运行T4而不会出现问题且易于调试:

步骤1:为模型

创建一个单独的类库项目

为模型创建一个单独的类库项目,供您的应用程序和T4模板引用。

这也简化了单元测试并解决了T4的许多问题。

Step2:解析连接字符串

为了避免配置文件的问题和正确配置connectionString,创建一个部分类来扩展Context类,以避免在重新生成上下文时覆盖。定义新的重载构造函数

例如NorthwindEntities

      using System.Data.Entity;
     namespace NorthWin
     {        
        public partial class NorthwindEntities : DbContext
        {
            public NorthwindEntities(string connString)
                : base(connString)
            {
            }
        }
    }

step3:在单独的类中创建所有DAL方法

T4模板中需要的所有方法,在同一个类库项目中的单独类中创建它,并从T4模板中调用它们。

在类中显式定义connectionString(注意连接字符串中的单引号)。编辑:或者您可以使用include模板。例子:

    using System.Linq;
    namespace NorthWin
    {
        public class DAL
        {
            string ConnectionString = @"metadata=res://*/NorthWind.csdl|res://*/NorthWind.ssdl|res://*/NorthWind.msl;provider=System.Data.SqlClient;provider connection string='data source=myserver;initial catalog=Northwind;persist security info=True;user id=xxx;password=yyy;MultipleActiveResultSets=True;App=EntityFramework';";
   public DAL (string connString)
    {
      ConnectionString =connString;
    }       
    public int GetCustomerCount()
            {
                var n = 0;
            // call ye new overload constructor
                using (var ctx = new NorthwindEntities(ConnectionString))
                {
                    n = ctx.Customers.Count();
                }
                return n;
            }
        }
    }

步骤4:构建T4定义EntityFramework和Call DAL方法的最小程序集

例子
    <#@ template debug="false" hostspecific="true" language="C#" #>
    <#@ output extension=".txt" #>
      <#@ assembly name="System.Xml"#>
    <#@ assembly name="$(TargetDir)NorthWin.dll" #>
    <#@ assembly name="$(TargetDir)EntityFramework.dll" #>
    <#@ assembly name="$(TargetDir)EntityFramework.SqlServer.dll" #>
    <#@ assembly name="EnvDTE" #>
    <#@ assembly name="System.Configuration" #>
    <#@ import namespace="System.Configuration" #>
    <#@ import namespace="System" #>
     <#@ import namespace="System.Linq" #>
    <#@ import namespace="System.Collections.Generic" #>
     <#@ import namespace="NorthWin" #>
    <#
       int n=0;
        var dal = new DAL();
       / /call DAL methods
        n= dal.GetCustomerCount();
     #> 
    <#= n #>
    {
      ... // More code here. 
    }

T4模板输出:

114
{
  ... // More code here. 
}
编辑:

您可以使用如下所述的include文件从配置文件中获取connectionString:

注入你的Web。在T4模板中配置连接字符串

然后将connectionString传递给带有接受连接字符串的构造函数的DAL类。

在模板中添加以下代码

<#@ include file="ConfigurationAccessor.ttinclude" #>
<# 
 var config = new ConfigurationAccessor((IServiceProvider)this.Host,  @"path'to'ProjectWithConfig.csproj");
 string connectionString =   config.ConnectionStrings["MainConnectionString"].ConnectionString;
#>