Merge branch 'release/FixUpdatePipe_01'

This commit is contained in:
Samuele Locatelli
2025-12-03 11:18:02 +01:00
21 changed files with 111 additions and 75 deletions
+20 -10
View File
@@ -96,8 +96,11 @@ namespace LiMan.APi.Controllers
if (CheckReqKeys(CurrReq))
{
result = await dataService.ReleaseDtoGetByApp(CurrReq.CodApp);
// non necessario notificare UI...
#if false
// invio notifica x app...
dataService.TaskMessPipe.sendMessage(CurrReq.CodImp);
dataService.UpdActMessPipe.sendMessage(CurrReq.CodImp);
#endif
// registro updater...
dataService.UpdaterRecordAction(CurrReq.CodImp, "GetReleases");
@@ -120,8 +123,11 @@ namespace LiMan.APi.Controllers
if (CheckReqKeys(CurrReq))
{
result = await dataService.ReleaseGetCritical();
// non necessario notificare UI...
#if false
// invio notifica x app...
dataService.TaskMessPipe.sendMessage(CurrReq.CodImp);
dataService.UpdActMessPipe.sendMessage(CurrReq.CodImp);
#endif
// registro updater...
dataService.UpdaterRecordAction(CurrReq.CodImp, "GetReleasesCritical");
@@ -154,11 +160,14 @@ namespace LiMan.APi.Controllers
NumImp = CurrReq.NumImp,
VersNum = CurrReq.VersMin
};
dataService.InstallRelUpsert(checkRec);
// chiamata x effettuare eventuale snapshot sulle installazioni attive
await dataService.InstallRelHistSnapshot(false);
// invio notifica x app...
dataService.TaskMessPipe.sendMessage(CurrReq.CodImp);
bool changed = dataService.InstallRelUpsert(checkRec);
// chiamata x effettuare eventuale snapshot sulle installazioni attive SE variato
await dataService.InstallRelHistSnapshot(changed);
if (changed)
{
// invio notifica x app...
dataService.UpdActMessPipe.sendMessage(CurrReq.CodImp);
}
// registro updater...
dataService.UpdaterRecordAction(CurrReq.CodImp, "GetReleasesFilt");
@@ -181,9 +190,10 @@ namespace LiMan.APi.Controllers
if (CheckReqKeys(CurrReq))
{
result = await dataService.ReleaseGetByAppVersLimit(CurrReq.CodApp, CurrReq.VersMin, CurrReq.VersMax);
#if false
// invio notifica x app...
dataService.TaskMessPipe.sendMessage(CurrReq.CodImp);
dataService.UpdActMessPipe.sendMessage(CurrReq.CodImp);
#endif
// registro updater...
dataService.UpdaterRecordAction(CurrReq.CodImp, "GetReleasesLimit");
@@ -313,7 +323,7 @@ namespace LiMan.APi.Controllers
dataService.UpdaterRecordAction(CurrReq.CodImp, "SetManaged");
// invio notifica x app...
dataService.TaskMessPipe.sendMessage(CurrReq.CodImp);
dataService.UpdActMessPipe.sendMessage(CurrReq.CodImp);
}
await Task.Delay(1);
return result;
+6 -6
View File
@@ -112,7 +112,7 @@ namespace LiMan.APi.Data
}
#endif
// invio string in messagepipe x forzare refresh...
TaskMessPipe.sendMessage(CodImp);
UpdActMessPipe.sendMessage(CodImp);
}
/// <summary>
@@ -139,7 +139,7 @@ namespace LiMan.APi.Data
// salvo in altra hash (con key da CodImp) le info specifiche ricevute
redisHashKeySet(reqKey, CodImp, Value);
// invio string in messagepipe x forzare refresh...
TaskMessPipe.sendMessage(CodImp);
UpdActMessPipe.sendMessage(CodImp);
}
/// <summary>
@@ -425,7 +425,7 @@ namespace LiMan.APi.Data
answ.TryAdd(item.Key, item.Value);
}
// invio string in messagepipe x forzare refresh...
TaskMessPipe.sendMessage(CodImp);
UpdActMessPipe.sendMessage(CodImp);
return answ;
}
@@ -453,7 +453,7 @@ namespace LiMan.APi.Data
done += answ ? 1 : 0;
}
// invio string in messagepipe x forzare refresh...
TaskMessPipe.sendMessage(CodImp);
UpdActMessPipe.sendMessage(CodImp);
return done;
}
@@ -483,7 +483,7 @@ namespace LiMan.APi.Data
done += answ ? 1 : 0;
}
// invio string in messagepipe x forzare refresh...
TaskMessPipe.sendMessage(CodImp);
UpdActMessPipe.sendMessage(CodImp);
return done;
}
@@ -547,7 +547,7 @@ namespace LiMan.APi.Data
redisHashKeySet((RedisKey)$"{rKeyUpdLastAct}List", CodImp, $"{DateTime.Now:yyyy-MM-dd HH:mm:ss}");
// invio string in messagepipe x forzare refresh...
UpdActMessPipe.sendMessage(CodImp);
TaskMessPipe.sendMessage(CodImp);
return done;
}
+1 -1
View File
@@ -1,6 +1,6 @@
<body>
<i>License Manager</i>
<h4>Versione: 2.1.2509.1212</h4>
<h4>Versione: 2.1.2512.0311</h4>
<br /> Note di rilascio:
<ul>
<li>
+1 -1
View File
@@ -1 +1 @@
2.1.2509.1212
2.1.2512.0311
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<item>
<version>2.1.2509.1212</version>
<version>2.1.2512.0311</version>
<url>https://nexus.steamware.net/repository/SWS/LiMan/stable/LAST/LiMan.UI.zip</url>
<changelog>https://nexus.steamware.net/repository/SWS/LiMan/stable/LAST/ChangeLog.html</changelog>
<mandatory>false</mandatory>
+7 -2
View File
@@ -1596,6 +1596,7 @@ namespace LiMan.DB.Controllers
public bool InstallRelUpsert(InstalledReleasesModel upRec)
{
bool fatto = false;
bool changed = false;
using (LMDbContext localDbCtx = new LMDbContext(_configuration))
{
// cerco record esistente...
@@ -1618,7 +1619,10 @@ namespace LiMan.DB.Controllers
currRec.IdxLic = recIst.IdxLic;
}
}
// se trovo aggiorno...
// indico cambiato SSE variata la versione...
changed = !currRec.VersNum.Equals(upRec.VersNum);
// ...quindi aggiorno...
currRec.DtCheck = upRec.DtCheck;
currRec.MastKey = upRec.MastKey;
currRec.NumImp = upRec.NumImp;
@@ -1639,13 +1643,14 @@ namespace LiMan.DB.Controllers
localDbCtx
.DbSetInstallRel
.Add(upRec);
changed = true;
}
// salvataggio!
try
{
// salvo
var res = localDbCtx.SaveChanges();
fatto = res != 0;
fatto = res != 0 && changed;
}
catch (Exception ex)
{
+6 -6
View File
@@ -6,12 +6,12 @@
<ItemGroup>
<PackageReference Include="MailKit" Version="2.15.0" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="6.0.28" />
<PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="6.0.28" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.28" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.28" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.28" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.28">
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="6.0.36" />
<PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="6.0.36" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.36" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.36" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.36" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.36">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
+29 -11
View File
@@ -52,8 +52,8 @@ namespace LiMan.DB.Services
// conf messagepipe: setup canali pub/sub
EnrollMessPipe = new MessagePipe(redisConn, Const.ENRL_MSG_PIPE);
TaskMessPipe = new MessagePipe(redisConn, Const.TASK_MSG_PIPE);
UpdActMessPipe = new MessagePipe(redisConn, Const.UPDT_MSG_PIPE);
UpdActMessPipe = new MessagePipe(redisConn, Const.TASK_MSG_PIPE);
TaskMessPipe = new MessagePipe(redisConn, Const.UPDT_MSG_PIPE);
_emailSender = emailSender;
// conf DB
@@ -78,16 +78,16 @@ namespace LiMan.DB.Services
/// </summary>
public MessagePipe EnrollMessPipe { get; set; } = null!;
/// <summary>
/// Wrapper x invio/ricezione messaggi sul canale dedicato agli eventi Task
/// </summary>
public MessagePipe TaskMessPipe { get; set; } = null!;
/// <summary>
/// Wrapper x invio/ricezione messaggi sul canale dedicato a generico update info dai vari EgwACC
/// </summary>
public MessagePipe UpdActMessPipe { get; set; } = null!;
/// <summary>
/// Wrapper x invio/ricezione messaggi sul canale dedicato agli eventi Task
/// </summary>
public MessagePipe TaskMessPipe { get; set; } = null!;
#endregion Public Properties
#region Public Methods
@@ -1196,11 +1196,13 @@ namespace LiMan.DB.Services
DateTime adesso = DateTime.Now;
if (adesso > VetoInstRelHistSnap || doForce)
{
// veto x 4h (+/- rand 60 min)
VetoInstRelHistSnap = adesso.AddHours(4).AddMinutes(rnd.Next(-60, 60));
// veto x 4h (+/- rand 30 min)
VetoInstRelHistSnap = adesso.AddHours(4).AddMinutes(rnd.Next(-30, 30));
// calcolo periodo come x interfaccia...
DateTime DtFine = DateTime.Today.AddHours(DateTime.Now.Hour);
DateTime DtFine = DateTime.Today.AddHours(DateTime.Now.Hour + 1);
DateTime DtInizio = DateTime.Today.AddMonths(-1);
// svuoto cache info...
await ResetInstallStatus();
// recupero info DTO
var rawData = await InstallStatusGetInfo(DtInizio, DtFine, "", "");
fatto = dbController.InstallRelHistSnapshot(rawData.InstallStatus);
@@ -1218,6 +1220,22 @@ namespace LiMan.DB.Services
return fatto;
}
/// <summary>
/// Reset cache info installazioni x forzare reload
/// </summary>
/// <returns></returns>
public async Task<bool> ResetInstallStatus()
{
bool fatto = false;
Stopwatch sw = new Stopwatch();
sw.Start();
string source = "REDIS";
fatto = await FlushRedisCachePattern($"InstVerSta");
sw.Stop();
Log.Debug($"ResetInstallStatus | {source} cleanup in: {sw.Elapsed.TotalMilliseconds} ms");
return fatto;
}
/// <summary>
/// Recupera info statistiche installazione dato periodo riferimento, da cache o da db
/// </summary>
@@ -1233,7 +1251,7 @@ namespace LiMan.DB.Services
{
string filtCli = string.IsNullOrEmpty(CodInst) ? "ALL-INSTALL" : $"{CodInst}";
string filtTipo = string.IsNullOrEmpty(TipoApp) ? "ALL-TIPO" : $"{TipoApp}";
string currKey = $"{Const.rKeyConfig}:InstVerSta:{filtTipo}:{filtCli}:{dtStart:yyyyMMdd-HHmmss}:{dtEnd:yyyyMMdd-HHmmss}";
string currKey = $"{Const.rKeyConfig}:InstVerSta:{filtTipo}:{filtCli}:{dtStart:yyyyMMdd-HHmm}:{dtEnd:yyyyMMdd-HHmm}";
Stopwatch sw = new Stopwatch();
sw.Start();
string? rawData = await redisDb.StringGetAsync(currKey);
+4 -4
View File
@@ -11,13 +11,13 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.28" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.28">
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.36" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.36">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.28" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.28" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.36" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.36" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="6.0.3" />
<PackageReference Include="Microsoft.IdentityModel.JsonWebTokens" Version="6.36.0" />
<PackageReference Include="NLog" Version="5.3.2" />
+4 -4
View File
@@ -11,10 +11,10 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.28" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.28" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.28" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.28">
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.36" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.36" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.36" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.36">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
+1 -1
View File
@@ -1,6 +1,6 @@
<body>
<i>License Manager</i>
<h4>Versione: 2.1.2509.1212</h4>
<h4>Versione: 2.1.2512.0311</h4>
<br />
Note di rilascio:
<ul>
+1 -1
View File
@@ -1 +1 @@
2.1.2509.1212
2.1.2512.0311
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<item>
<version>2.1.2509.1212</version>
<version>2.1.2512.0311</version>
<url>https://nexus.steamware.net/repository/SWS/LiMan/stable/LAST/LiMan.Transfer.zip</url>
<changelog>https://nexus.steamware.net/repository/SWS/LiMan/stable/LAST/ChangeLog.html</changelog>
<mandatory>false</mandatory>
+3 -3
View File
@@ -18,7 +18,7 @@ namespace LiMan.UI.Components
public void Dispose()
{
LMDService.EnrollMessPipe.EA_NewMessage -= async (sender, e) => await EnrollMessPipe_EA_NewMessage(sender, e);
LMDService.TaskMessPipe.EA_NewMessage -= async (sender, e) => await TaskMessPipe_EA_NewMessage(sender, e);
LMDService.UpdActMessPipe.EA_NewMessage -= async (sender, e) => await TaskMessPipe_EA_NewMessage(sender, e);
MServ.EA_SelCodImp -= async () => await MServ_EA_SelCodImp();
MServ.EA_SelCodInst -= async () => await MServ_EA_SelCodInst();
}
@@ -89,7 +89,7 @@ namespace LiMan.UI.Components
protected override async Task OnInitializedAsync()
{
LMDService.EnrollMessPipe.EA_NewMessage += async (sender, e) => await EnrollMessPipe_EA_NewMessage(sender, e);
LMDService.TaskMessPipe.EA_NewMessage += async (sender, e) => await TaskMessPipe_EA_NewMessage(sender, e);
LMDService.UpdActMessPipe.EA_NewMessage += async (sender, e) => await TaskMessPipe_EA_NewMessage(sender, e);
MServ.EA_SelCodImp += async () => await MServ_EA_SelCodImp();
MServ.EA_SelCodInst += async () => await MServ_EA_SelCodInst();
await ReloadLicData();
@@ -140,7 +140,7 @@ namespace LiMan.UI.Components
private string DevName { get; set; } = "";
private DateTime DtFine { get; set; } = DateTime.Today.AddHours(DateTime.Now.Hour);
private DateTime DtFine { get; set; } = DateTime.Today.AddHours(DateTime.Now.Hour + 1);
private DateTime DtInizio { get; set; } = DateTime.Today.AddMonths(-1);
+3 -3
View File
@@ -32,7 +32,7 @@ namespace LiMan.UI.Components
public void Dispose()
{
LMDService.TaskMessPipe.EA_NewMessage -= async (sender, e) => await TaskMessPipe_EA_NewMessage(sender, e);
LMDService.UpdActMessPipe.EA_NewMessage -= async (sender, e) => await TaskMessPipe_EA_NewMessage(sender, e);
}
#endregion Public Methods
@@ -67,7 +67,7 @@ namespace LiMan.UI.Components
ReloadTaskStatus();
ReloadTaskResults();
// invio notifica update...
LMDService.TaskMessPipe.sendMessage(selRec.CodApp);
LMDService.UpdActMessPipe.sendMessage(selRec.CodApp);
}
[Inject]
@@ -78,7 +78,7 @@ namespace LiMan.UI.Components
protected override void OnInitialized()
{
LMDService.TaskMessPipe.EA_NewMessage += async (sender, e) => await TaskMessPipe_EA_NewMessage(sender, e);
LMDService.UpdActMessPipe.EA_NewMessage += async (sender, e) => await TaskMessPipe_EA_NewMessage(sender, e);
}
protected override void OnParametersSet()
+11 -4
View File
@@ -22,7 +22,7 @@ namespace LiMan.UI.Components
public void Dispose()
{
LMDService.EnrollMessPipe.EA_NewMessage -= async (sender, e) => await EnrollMessPipe_EA_NewMessage(sender, e);
LMDService.TaskMessPipe.EA_NewMessage -= async (sender, e) => await TaskMessPipe_EA_NewMessage(sender, e);
LMDService.UpdActMessPipe.EA_NewMessage -= async (sender, e) => await TaskMessPipe_EA_NewMessage(sender, e);
MServ.EA_SelCodApp -= async () => await MServ_EA_SelCodApp();
MServ.EA_SelCodImp -= async () => await MServ_EA_SelCodImp();
MServ.EA_SelCodInst -= async () => await MServ_EA_SelCodInst();
@@ -97,7 +97,7 @@ namespace LiMan.UI.Components
protected override async Task OnInitializedAsync()
{
LMDService.EnrollMessPipe.EA_NewMessage += async (sender, e) => await EnrollMessPipe_EA_NewMessage(sender, e);
LMDService.TaskMessPipe.EA_NewMessage += async (sender, e) => await TaskMessPipe_EA_NewMessage(sender, e);
LMDService.UpdActMessPipe.EA_NewMessage += async (sender, e) => await TaskMessPipe_EA_NewMessage(sender, e);
MServ.EA_SelCodApp += async () => await MServ_EA_SelCodApp();
MServ.EA_SelCodImp += async () => await MServ_EA_SelCodImp();
MServ.EA_SelCodInst += async () => await MServ_EA_SelCodInst();
@@ -164,7 +164,7 @@ namespace LiMan.UI.Components
}
private string DevName { get; set; } = "";
private DateTime DtFine { get; set; } = DateTime.Today.AddHours(DateTime.Now.Hour);
private DateTime DtFine { get; set; } = DateTime.Today.AddHours(DateTime.Now.Hour + 1);
private DateTime DtInizio { get; set; } = DateTime.Today.AddMonths(-1);
private InstallStatusDTO InfoStats { get; set; } = new InstallStatusDTO();
private bool isLoading { get; set; } = false;
@@ -374,7 +374,7 @@ namespace LiMan.UI.Components
await Task.Delay(5);
}
}
// mando notifica con messageservice...
// mando notifica con messageservice...
MServ.ReportTaskChange();
}
@@ -440,6 +440,13 @@ namespace LiMan.UI.Components
if (!string.IsNullOrEmpty(currArgs.newMessage))
{
isLoading = true;
InfoStats = null;
#if false
// svuoto cache preliminarmente
await LMDService.ResetInstallStatus();
#endif
await ReloadLicData();
await ReloadData();
ReloadTaskStatus();
isLoading = false;
await InvokeAsync(StateHasChanged);
+5 -9
View File
@@ -2,7 +2,7 @@
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Version>2.1.2509.1212</Version>
<Version>2.1.2512.0311</Version>
<RootNamespace>LiMan.UI</RootNamespace>
<AssemblyName>LiMan.UI</AssemblyName>
</PropertyGroup>
@@ -50,14 +50,10 @@
<PackageReference Include="Blazored.LocalStorage" Version="4.5.0" />
<PackageReference Include="Blazored.SessionStorage" Version="2.4.0" />
<PackageReference Include="EgwCoreLib.Razor" Version="1.5.2501.1716" />
<PackageReference Include="EgwCoreLib.Utils" Version="1.5.2501.1716" />
<PackageReference Include="EgwProxy.MP.Core" Version="1.0.2412.2310" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.Negotiate" Version="6.0.28" />
<PackageReference Include="Microsoft.AspNetCore.Components" Version="6.0.21" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.28">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="EgwCoreLib.Utils" Version="1.5.2511.312" />
<PackageReference Include="EgwProxy.MP.Core" Version="1.0.2511.1416" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.Negotiate" Version="6.0.36" />
<PackageReference Include="Microsoft.AspNetCore.Components" Version="6.0.36" />
<PackageReference Include="Microsoft.IdentityModel.JsonWebTokens" Version="6.36.0" />
<PackageReference Include="Microsoft.IdentityModel.Logging" Version="6.36.0" />
<PackageReference Include="Microsoft.IdentityModel.Protocols" Version="6.36.0" />
+1 -1
View File
@@ -1,6 +1,6 @@
<body>
<i>License Manager</i>
<h4>Versione: 2.1.2509.1212</h4>
<h4>Versione: 2.1.2512.0311</h4>
<br /> Note di rilascio:
<ul>
<li>
+1 -1
View File
@@ -1 +1 @@
2.1.2509.1212
2.1.2512.0311
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<item>
<version>2.1.2509.1212</version>
<version>2.1.2512.0311</version>
<url>https://nexus.steamware.net/repository/SWS/LiMan/stable/LAST/LiMan.UI.zip</url>
<changelog>https://nexus.steamware.net/repository/SWS/LiMan/stable/LAST/ChangeLog.html</changelog>
<mandatory>false</mandatory>
+4 -4
View File
@@ -11,13 +11,13 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.28" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.28">
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.36" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.36">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.28" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.28">
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.36" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.36">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>