c# - T4 - Entity Framework 错误 : Method not found: 'System.Data.Entity.DbSet` 1

标签 c# entity-framework t4

尝试创建一个相当简单的 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: 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();

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

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 文件复制到包含 .tt 文件的项目中

有什么想法吗?

最佳答案

T4模板在同一个项目中的类是不可见的,为了简化它的调试,下面一步一步地在EntityFramework中成功运行T4,没有问题并且易于调试:

第 1 步:为模型创建一个单独的类库项目

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

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

第二步:解析连接字符串

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

例如,NorthwindEntities

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

第 3 步:在单独的类中创建所有 DAL 方法

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

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

    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

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

在你的模板中添加这段代码

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

关于c# - T4 - Entity Framework 错误 : Method not found: 'System.Data.Entity.DbSet` 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38879731/

相关文章:

asp.net - Javascript结果生成Jquery CRUD ajax操作

c# - 如何使用 Moq 在没有 setter 的情况下初始化复杂属性?

c# - Entity Framework : adding existing child POCO to new Parent POCO, 在数据库中创建新子项

.net - 在 Entity Framework 中建模订单与产品的关系

c# - 有没有可能 DbContext.SaveChanges() 返回 0 但没有异常?

.net - 有什么办法可以在基本的T4模板中提供功能吗?

json.net - 使用第 3 方程序集进行 T4 模板化

c# - UserManager 在创建用户时不初始化属性

c# - 从 C# 应用程序调用运行文件时出现问题

c# - Visual Studio 扩展 : Custom Quick Action