NET8 ORM 使用AOT SqlSugar

2023-11-18 06:00:18

AOT介紹

.Net8的本地預編機器碼AOT,它幾乎進行了100%的自舉。微軟為了擺脫C++的鉗制,做了很多努力。也就是程式碼幾乎是用C#重寫,包括了虛擬機器器,GC,記憶體模型等等。而需要C++做的,也就僅僅是載入程式,本篇通過程式碼來看下這段至關重要的載入程式的運作模式。

 

支援功能

 

SqlSugar ORM使用AOT


.NET AOT8 基本上能夠免強使用了, SqlSugar ORM也支援了CRUD 能在AOT下執行了

Nuget安裝

SqlSugarCore

具體程式碼

StaticConfig.EnableAot = true;//啟用AOT 程式啟動執行一次就好了

//用SqlSugarClient每次都new,不要用單例模式
var db = new SqlSugarClient(new ConnectionConfig()
{
IsAutoCloseConnection = true,
DbType = DbType.Sqlite,
ConnectionString = "datasource=demo.db"

},
it =>
{
// Logging SQL statements and parameters before execution
// 在執行前記錄 SQL 語句和引數
it.Aop.OnLogExecuting = (sql, para) =>
{
Console.WriteLine(UtilMethods.GetNativeSql(sql, para));
};
});
return db;
已支援功能
//查詢
var list=db.Queryable<Student>().ToList();
var list2=db.Queryable<Student>().ToDataTable();
var list3= db.Queryable<Student>().Select(it=>new {
id=it.Id
}).ToList();

//插入 、刪除和更新只要是實體目前測試下來 都OK
db.Insertable(new Student()
{
Id = 1,
Name = "aa"
}).ExecuteCommand();
db.Deleteable(new Student()
{
Id = 1,
Name = "aa"
}).ExecuteCommand();
db.Updateable(new Student()
{
Id = 1,
Name = "aa"
}).ExecuteCommand();

//寫sql也支援
db.Ado.GetDataTable(sql);
db.Ado.ExecuteCommand(sql);

  

不支功能

//部分庫建表不支援
//動態建類不支援

 

AOT設定教學

建立一個帶AOT的類專案

 

 

 

新建一個rd.xml

<Directives>
<Application>
<Assembly Name="SqlSugar" Dynamic="Required All">
</Assembly>
</Application>
</Directives>

改專案檔案

<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<InvariantGlobalization>true</InvariantGlobalization>
<PublishAot>true</PublishAot>
<Platforms>AnyCPU;x64</Platforms>
</PropertyGroup>
<ItemGroup>
<RdXmlFile Include="rd.xml" />
</ItemGroup>

RdXmlFile這個重點參照我們新建的rd.xml (這個xml要能釋出出去)
 

如何讓自已程式碼支援AOT

1、不能有dynamic型別 可以用object替換

2、不能有emit可以用表示式樹代替換

3、一些反射找不到建構函式或者Type需要設定xml 

4、反射不支援根據路徑載入程式集,可以從一個類的Type中拿出來

5、釋出出現c++錯誤,需在安裝和更新VS的地方把 c++桌面 裝上