я пытаюсь достичь простого кода. net основной фоновый рабочий (. net основной 3.1), где я записываю данные в SQL серверную базу данных (через EF Core 3.1), пока этот рабочий работает как windows служба.
Когда я запускаю приведенный ниже код из Visual Studio 2019, все работает, но когда я публикую sh (Target win-x64) и регистрирую .exe в качестве службы на моем машина win10, я получаю следующее исключение:
Microsoft.Data.SqlClient is not supported on this platform.
Есть мысли о том, что вызывает это и как это исправить?
Program.cs
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Soteria.Common.Database;
namespace Soteria.Service
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args)
{
var host = Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureServices((hostContext, services) =>
{
var optionsBuilder = new DbContextOptionsBuilder<SoteriaDbContext>();
optionsBuilder.UseSqlServer("Server=.\\SQLEXPRESS;Database=Soteria;Trusted_Connection=True;");//,
services.AddScoped<SoteriaDbContext>(s => new SoteriaDbContext(optionsBuilder.Options));
services.AddHostedService<Worker>();
});
return host;
}
}
}
Worker.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Soteria.Common.Database;
using Soteria.Common.Messaging;
using Soteria.Common.Models;
namespace Soteria.Service
{
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
private readonly IServiceScopeFactory _serviceScopeFactory;
public Worker(ILogger<Worker> logger, IServiceScopeFactory serviceScopeFactory)
{
_logger = logger;
_serviceScopeFactory = serviceScopeFactory;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
using var scope = _serviceScopeFactory.CreateScope();
var dbContext = scope.ServiceProvider.GetRequiredService<SoteriaDbContext>();
dbContext.Tests.Add(new Test() {Date = DateTime.Now});
dbContext.SaveChanges();
await Task.Delay(1000, stoppingToken);
}
}
}
}
SoteriaDbContext.cs
using Microsoft.EntityFrameworkCore;
using Soteria.Common.Models;
namespace Soteria.Common.Database
{
public class SoteriaDbContext: DbContext
{
public SoteriaDbContext(DbContextOptions<SoteriaDbContext> options)
: base(options)
{
}
public DbSet<Test> Tests { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Test>().ToTable("Tests");
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.EnableSensitiveDataLogging(true);
}
}
}
Test.cs
using System;
namespace Soteria.Common.Models
{
public class Test
{
public int? Id { get; set; }
public DateTime Date { get; set; }
}
}
Тесты. sql
CREATE TABLE [dbo].[Tests]
(
[Id] INT NOT NULL PRIMARY KEY IDENTITY,
[Date] DATETIME NOT NULL
)