T4 - Entity Framework Error: Method not found: 'System.Data.Entity.DbSet`1
T4 - Entity Framework Error: Method not found: 'System.Data.Entity.DbSet`1
尝试创建一个相当简单的 T4,我正在尝试加载一些我以后可以使用的值:
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="c:\users\<username>\documents\visual studio 2015\Projects_DataModelGenerator\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.dll" #>
<#@ assembly name="c:\users\<username>\documents\visual studio 2015\Projects_DataModelGenerator\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.SqlServer.dll" #>
<#@ assembly name="c:\users\<username>\documents\visual studio 2015\Projects_DataModelGenerator_Data\bin\Debug_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: Method
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();
在我的 class 库中添加了一个 class:
public class dbc
{
private DevEntities dbContext;
public dbc()
{
dbContext = new DevEntities();
}
public DevEntities returnContext()
{
return dbContext;
}
}
与之前相同的错误:
Running transformation: System.MissingMethodException: Method not
found: 'System.Data.Entity.DbSet
但是,当我调试 t4 模板时,我收到了一条不同的消息:
No connection string named 'DevEntities' could be found in the
application config file.
但是,我已将包含 .edmx 文件的 App.config 文件从我的 class 库复制到包含 .tt 文件的我的项目中
有什么想法吗?
T4模板同工程中的classes是看不到的,为了方便调试,下面一步步把运行T4在[=74中成功] =]没有问题且易于调试:
第 1 步:为模型创建一个单独的 class 库项目
为模型创建一个单独的 class 库项目,以供您的应用程序和 T4 模板引用。
这也简化了单元测试并解决了 T4 的许多问题。
步骤 2:解析连接字符串
为了避免配置文件的问题并正确配置connectionString,创建一个扩展上下文class的部分class以避免在重新生成上下文时覆盖。
定义新的重载构造函数。
例如,NorthwindEntities
using System.Data.Entity;
namespace NorthWin
{
public partial class NorthwindEntities : DbContext
{
public NorthwindEntities(string connString)
: base(connString)
{
}
}
}
步骤 3:在单独的 class(s)
中创建所有 DAL 方法
您在 T4 模板中需要的所有方法,在同一个 class 库项目中的单独 class(es) 中创建它并从 T4 模板中调用它们。
在 class 中明确定义连接字符串(注意连接字符串中的单引号)。
编辑: 或者您可以使用包含模板。
示例:
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 定义最小程序集并调用 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.
}
编辑:
您可以使用包含文件从配置文件中获取连接字符串,如下所述:
Injecting Your Web.Config Connection String Into Your T4 Template
然后您将 connectionString 传递给您的 DAL classes 以及接受连接字符串的构造函数。
在您的模板中添加此代码
<#@ include file="ConfigurationAccessor.ttinclude" #>
<#
var config = new ConfigurationAccessor((IServiceProvider)this.Host, @"path\to\ProjectWithConfig.csproj");
string connectionString = config.ConnectionStrings["MainConnectionString"].ConnectionString;
#>
尝试创建一个相当简单的 T4,我正在尝试加载一些我以后可以使用的值:
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="c:\users\<username>\documents\visual studio 2015\Projects_DataModelGenerator\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.dll" #>
<#@ assembly name="c:\users\<username>\documents\visual studio 2015\Projects_DataModelGenerator\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.SqlServer.dll" #>
<#@ assembly name="c:\users\<username>\documents\visual studio 2015\Projects_DataModelGenerator_Data\bin\Debug_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: Method 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();
在我的 class 库中添加了一个 class:
public class dbc
{
private DevEntities dbContext;
public dbc()
{
dbContext = new DevEntities();
}
public DevEntities returnContext()
{
return dbContext;
}
}
与之前相同的错误:
Running transformation: System.MissingMethodException: Method not found: 'System.Data.Entity.DbSet
但是,当我调试 t4 模板时,我收到了一条不同的消息:
No connection string named 'DevEntities' could be found in the application config file.
但是,我已将包含 .edmx 文件的 App.config 文件从我的 class 库复制到包含 .tt 文件的我的项目中
有什么想法吗?
T4模板同工程中的classes是看不到的,为了方便调试,下面一步步把运行T4在[=74中成功] =]没有问题且易于调试:
第 1 步:为模型创建一个单独的 class 库项目
为模型创建一个单独的 class 库项目,以供您的应用程序和 T4 模板引用。
这也简化了单元测试并解决了 T4 的许多问题。
步骤 2:解析连接字符串
为了避免配置文件的问题并正确配置connectionString,创建一个扩展上下文class的部分class以避免在重新生成上下文时覆盖。 定义新的重载构造函数。
例如,NorthwindEntities
using System.Data.Entity;
namespace NorthWin
{
public partial class NorthwindEntities : DbContext
{
public NorthwindEntities(string connString)
: base(connString)
{
}
}
}
步骤 3:在单独的 class(s)
中创建所有 DAL 方法您在 T4 模板中需要的所有方法,在同一个 class 库项目中的单独 class(es) 中创建它并从 T4 模板中调用它们。
在 class 中明确定义连接字符串(注意连接字符串中的单引号)。 编辑: 或者您可以使用包含模板。 示例:
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 定义最小程序集并调用 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.
}
编辑:
您可以使用包含文件从配置文件中获取连接字符串,如下所述:
Injecting Your Web.Config Connection String Into Your T4 Template
然后您将 connectionString 传递给您的 DAL classes 以及接受连接字符串的构造函数。
在您的模板中添加此代码
<#@ include file="ConfigurationAccessor.ttinclude" #>
<#
var config = new ConfigurationAccessor((IServiceProvider)this.Host, @"path\to\ProjectWithConfig.csproj");
string connectionString = config.ConnectionStrings["MainConnectionString"].ConnectionString;
#>