SqLite数据库的LinqToDb T4模板问题(使用LoadSQLiteMetadata)

时间:2015-11-25 21:41:12

标签: sqlite t4 linq2db

我正在尝试使用LinqToDb的本地SqlLite数据库(在我的app_data中)。

任何人都知道为什么LinqToDb无法使用以下连接字符串?

  <connectionStrings>
    <add name="RecyclesDB"
         providerName="System.Data.SqlLite"
         connectionString="data source=|DataDirectory|Recycles.sqlite3;Version=3;" 
         />
  </connectionStrings>

我可以完美地使用这个连接字符串来检索旧式的数据。

  SQLiteConnection sqlConn;
  var sqlCmd = new SQLiteCommand();
    using (sqlConn = new SQLiteConnection(ConfigurationManager.ConnectionStrings["RecyclesDB"].ConnectionString))
    {
      sqlConn.Open();
      sqlCmd.Connection = sqlConn;
 /* .... */               
    }

但是,当我尝试将LinqToDB与以下t4模板一起使用时,它将失败

<#@ template language="C#" debug="True" hostSpecific="True"                           #>
<#@ output extension=".generated.cs"                                                  #>
<#@ include file="$(ProjectDir)LinqToDB.Templates\LinqToDB.SQLite.Tools.ttinclude" #>

<#@ include file="$(ProjectDir)LinqToDB.Templates\PluralizationService.ttinclude"     #>

<#
    NamespaceName = "RecycleDashboard";
    LoadSQLiteMetadata(LoadSQLiteMetadata(@"C:\inetpub\RecycleDashboard\app_data", "Recycles.sqlite3"););
    GenerateModel();
#>

指定问题。 T4模板可以生成模型,但是当我尝试使用以下代码时,我得到一个空引用

    using (var db = new RecyclesDB())
    {
        var recycles =
            (from recycle in db.AppRecycles
             select recycle).ToList();
    }

新RecyclesDB()的例外是:

System.NullReferenceException was unhandled by user code
  HResult=-2147467261
  Message=Object reference not set to an instance of an object.
  Source=linq2db
  StackTrace:
       at LinqToDB.Data.DataConnection..ctor(String configurationString) in i:\linq2db\Source\Data\DataConnection.cs:line 41
       at LinqToDB.Data.DataConnection..ctor() in i:\linq2db\Source\Data\DataConnection.cs:line 24
       at RecycleDashboard.RecyclesDB..ctor() in 
 ...

有人知道这里有什么问题吗?

1 个答案:

答案 0 :(得分:0)

好的,以防万一其他人偶然发现Sqlite Dataprovider的问题

我解决了这个问题,但具体指定了我的DataConnection,如下所示 (https://github.com/linq2db/linq2db上建议的GetDataProvider和GetConnection):

public partial class RecyclesDB : LinqToDB.Data.DataConnection
    {
    public RecyclesDB() : base(GetDataProvider(), GetConnection()) { }

    private static IDataProvider GetDataProvider()
    {
        return new LinqToDB.DataProvider.SQLite.SQLiteDataProvider();
    }

    private static IDbConnection GetConnection()
    {
        return new SQLiteConnection(ConfigurationManager.ConnectionStrings["RecyclesDB"].ConnectionString);
    }
}

不确定为什么T4模板生成的代码失败,但看起来LinqToDB DataConnection类无法解析数据提供者名称&#39; System.Data.SQLite&#39;自动。