前言
自己的.net 6项目升级.net 7基本已经搞完,沉淀下来,决定结合git commit上的记录和一些自己遇到的坑,水上一篇,记录一下。
绝大多数的情况
6升7的体验总体来说还是好的,把.csproj中的
<TargetFramework>net6.0</TargetFramework>
改为
<TargetFramework>net7.0</TargetFramework>
再把nuget package update一下就完事了。很多第三方包也是第一时间适配.net 7,比如我自己的Blazor.ECharts,还有盛派的SDK等。
EFCore 7的原生Batch
EFCore 7已经原生支持Batch,于是把一直在用的EFCore.BulkExtensions拿掉。修改也简单,诸如把
await db.Tdplans.Where(t => t.GprsId == d.Key).BatchDeleteAsync(stoppingToken);
await db.Suppliers.Where(s => s.bizNo == supplier.bizNo).BatchUpdateAsync(new SupplierClass { IsDelete = true });
改为
await db.Tdplans.Where(t => t.GprsId == d.Key).ExecuteDeleteAsync(stoppingToken);
await db.Suppliers.Where(s => s.bizNo == supplier.bizNo).ExecuteUpdateAsync(s => s.SetProperty(b => b.IsDelete, true));
Blazor
有个地方被标记过时了,顺便改了一下,不改貌似这个版本也不会有影响,看到划线的强迫症行为
private async Task BeginSignOut(MouseEventArgs args)
{
await SignOutManager.SetSignOutState();
Navigation.NavigateTo("authentication/logout");
}
to
private void BeginSignOut(MouseEventArgs args)
{
Navigation.NavigateToLogout("authentication/logout");
}
盛派SDK
有个地方会报错,提示 System.FormatException: The format of value '' is invalid.
当我发现问题,打算提交PR的时候,发现苏总已经修复了,这里要给苏总点个赞 https://github.com/Senparc/Senparc.CO2NET/commit/7d528baba23ad7186b3fd5e45bc7e71d57578f61
Orleans
由于大版本的破坏性修改,这个是升7最麻烦最复杂的。具体需要参考微软的文档:https://learn.microsoft.com/zh-cn/dotnet/orleans/whats-new-in-orleans
我这里只大概提一下我修改的要点。
Orleans Server
启动的时候的 ConfigureApplicationParts 配置已经不需要了,也就是以下代码可以删了
.ConfigureApplicationParts(parts =>
{
parts.AddApplicationPart(typeof(SessionControlGrain).Assembly).WithReferences();
})
Orleans Client
ClientBuilder + services.AddSingleton(Client) 已经不用了,提供了一个新的Client的配置注入方法。
.UseOrleansClient((context, client) => {
client.UseStaticClustering(new IPEndPoint(IPAddress.Parse(context.Configuration.GetSection("Option:OrleansServerIP").Value), 30000))
.Configure<ClusterOptions>(options => {
options.ClusterId = "JBBus.Orleans";
options.ServiceId = "JBBus.Orleans";
});
})
需要注意的是UseOrleansClient必须在ConfigureServices之前,否则Service会拿不到东西
还有一个地方需要注意的是,对于HostedService,不能直接在其构造函数中使用 client.GetGrain (之前基于.net6的orleans 3.6.5是可以这样用的),会提示找不到对象。需要在 StartAsync 里面调用。
Orleans Models
所有涉及数据传输和序列化的类都需要加上 [GenerateSerializer] 标记特性,虽说有宇宙第一IDE的加成,但如果类多的话工作量还是巨大。
需要注意的点:
- 基类和子类都需要加,并且ID都从0开始
- 如果你和我一样定义的Model也在别的地方使用的话,那么不需要在Orleans中虚拟化的属性需要标记 [field: NonSerialized] ,并且把ID的数字重新理顺
- GrainState 的实体类也必须标记
- 对于使用了第三方库的类型的属性,标记 ID 使用时会报错的,因为你没法在第三方库的类型里面加 [GenerateSerializer] ,只能暂时先标记 [field: NonSerialized] 改用基本数据类型绕过,或者 等
Orleans Grains
Microsoft.Orleans.CodeGenerator 被 Microsoft.Orleans.Sdk 取代
OnActivateAsync 多了参数 (CancellationToken cancellationToken) ,记得要加上
RegisterOrUpdateReminder 变扩展方法了,记得在前面加上 this.