0

我正在尝试将本地 SqlLite 数据库(在我的 app_data 中)文件夹与 LinqToDb 一起使用。

有人知道为什么 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();
    }

new 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 
 ...

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

4

1 回答 1

0

好的,以防万一其他人也遇到了 Sqlite Dataprovider 的问题

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

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 类无法自动解析 dataprovidername 'System.Data.SQLite'。

于 2015-12-06T13:06:08.127 回答