FreeSql.Provider.SqliteCore如何加密

FreeSql.Provider.SqliteCore

是FreeSql基於微軟提供的最新的Microsoft.Data.Sqlite.Core驅動的實現。

相關文章

支援的版本

  • .NETStandard2.0+
  • net6.0

由於目前處於測試階段,可使用myget源安裝FreeSql.Provider.SqliteCore包。

dotnet add package FreeSql.Provider.SqliteCore --source //www.myget.org/F/ncc/api/v3/index.json  --prerelease

不支援加密

0.安裝包。

dotnet add package SQLitePCLRaw.bundle_e_sqlite3 
dotnet add package FreeSql.Provider.SqliteCore

直接正常使用其他包一樣使用FreeSql即可。SQLitePCLRaw.bundle_e_sqlite3 包不支援加密,但此種方式是官方實現的SQlite版本

捆綁 描述
SQLitePCLRaw.bundle_e_sqlite3 在所有平台上提供一致版本的 SQLite。 包括 FTS4、FTS5、JSON1 和 R* 樹擴展。 建議使用
SQLitePCLRaw.bundle_e_sqlcipher 提供 SQLCipher 的非官方開放源程式碼內部版本。

FreeSql.Provider.SqliteCore如何加密

那我們不安裝 SQLitePCLRaw.bundle_e_sqlite3包,換SQLitePCLRaw.bundle_e_sqlcipher

只有sqlcipher才支援加密。

0.選擇一個目錄,創建一個控制台項目OvOv.FreeSqlMicrosoftSqliteCore

dotnet new console -n OvOv.FreeSqlMicrosoftSqliteCore
cd OvOv.FreeSqlMicrosoftSqliteCore

1.安裝包

dotnet add package SQLitePCLRaw.bundle_e_sqlcipher
dotnet add package FreeSql.Provider.SqliteCore  --source //www.myget.org/F/ncc/api/v3/index.json  --prerelease
  1. 連接串直接指定Password=xxx即可

創建一個類g.cs,可直接通過g.sqlite訪問到IFreeSql對象

public class g
{
    static Lazy<IFreeSql> sqliteLazy = new Lazy<IFreeSql>(() =>
    {
        var fsql = new FreeSql.FreeSqlBuilder()
                .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=local.db;Password=123qwe")
                .UseAutoSyncStructure(true)
                .UseLazyLoading(true)
                .UseMonitorCommand(
                    cmd => Trace.WriteLine("\r\n執行緒" + Thread.CurrentThread.ManagedThreadId + ": " + cmd.CommandText)
                    )
                .Build();
        return fsql;
    }
   );
    public static IFreeSql sqlite => sqliteLazy.Value;
}

測試加密,增加一些數據。Program.cs中測試

Test();

static void Test()
{
    IInsert<Topic> insert = g.sqlite.Insert<Topic>();
    var items = new List<Topic>();
    for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newTitle{a}", Clicks = a * 100 });

    var affrows = insert.AppendData(items).ExecuteAffrows();
    Console.WriteLine("affrows:" + affrows);
    var list = g.sqlite.Select<Topic>().ToList();
    Console.WriteLine("count:" + list.Count);
}



[Table(Name = "tb_topic_insert")]
class Topic
{
    [Column(IsIdentity = true, IsPrimary = true)]
    public int Id { get; set; }
    public int Clicks { get; set; }
    public string Title { get; set; }
    public DateTime CreateTime { get; set; }
}

運行項目

dotnet run

驗證是否登錄是否加密?

重新運行時,刪除 連接串中的Password,發現無法獲取數據。或使用Navicat Premium 工具發現無法連接。

+ .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=local.db;") 
- .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|local.db;Password=123qwe")

提示如下內容,但使用密碼時又能正常訪問數據。

SqliteException: SQLite Error 26: 'file is not a database'.

相比包 FreeSql.Provider.Sqlite來說,目前存在一些限制,

|DataDirectory| 默認不支援

需要使用前,指定具體的文件夾,此處相當於指定了當前dll所在目錄,即bin/Debug/net6.0。參考

string dataSubDirectory = Path.Combine(AppContext.BaseDirectory);

if (!Directory.Exists(dataSubDirectory))
    Directory.CreateDirectory(dataSubDirectory);

AppDomain.CurrentDomain.SetData("DataDirectory", dataSubDirectory);

即

public class g
{
    static Lazy<IFreeSql> sqliteLazy = new Lazy<IFreeSql>(() =>
    {
        string dataSubDirectory = Path.Combine(AppContext.BaseDirectory);

        if (!Directory.Exists(dataSubDirectory))
            Directory.CreateDirectory(dataSubDirectory);

        AppDomain.CurrentDomain.SetData("DataDirectory", dataSubDirectory);

        var fsql = new FreeSql.FreeSqlBuilder()
                .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|local.db;Password=123qwe")
                .UseAutoSyncStructure(true)
                .UseLazyLoading(true)
                .UseMonitorCommand(
                    cmd => Trace.WriteLine("\r\n執行緒" + Thread.CurrentThread.ManagedThreadId + ": " + cmd.CommandText)
                    )
                .Build();

        return fsql;
    }
   );
    public static IFreeSql sqlite => sqliteLazy.Value;
}


具體的鏈接串,請參考 //docs.microsoft.com/zh-cn/dotnet/standard/data/sqlite/connection-strings

如下數學函數不支援

  • Floor
  • Ceiling
  • Log10
  • Pow
  • Sqrt
  • Cos

TimeSpanTest 測試 類中 不通過、ulong最大值,最小值,超出範圍。

  • 不支援
  public void Days()
  {
      var data = new List<object>();
      data.Add(select.Where(a => a.CreateTime.TimeOfDay.Days == 0).ToList());
  }
  • 不支援
 public void Minutes()
  {
      var data = new List<object>();
      data.Add(select.Where(a => a.CreateTime.TimeOfDay.Minutes > 0).ToList());
  }

完整程式碼