Net Core Worker Windows 服务中的 EF Core DBContext

Ken*_*eth 6 background-service entity-framework-core .net-core

我想要实现的是编写一个简单的 .net core 后台工作程序(.net core 3.1),当这个工作程序作为 Windows 服务运行时,我将数据写入 SQL Server 数据库(通过 EF Core 3.1)。

当我从 Visual Studio 2019 运行以下代码时,一切正常,但是当我发布(目标为 win-x64)并将 .exe 注册为我的 win10 机器上的服务时,出现以下异常:

Microsoft.Data.SqlClient is not supported on this platform.
Run Code Online (Sandbox Code Playgroud)

关于导致此问题的原因以及如何解决此问题的任何想法?

程序.cs

Microsoft.Data.SqlClient is not supported on this platform.
Run Code Online (Sandbox Code Playgroud)

工人.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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

SoteriaDbContext.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);               
            }
        }  
    }
}
Run Code Online (Sandbox Code Playgroud)

测试文件

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

测试.sql

using System;

namespace Soteria.Common.Models
{
    public class Test
    {
        public int? Id { get; set; }
        public DateTime Date { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

Ken*_*eth 6

我必须安装 win-x64 文件夹的已发布源代码,而不是“发布”文件夹才能使其实际工作。即使我的目标运行时是 win-x64,这也会导致我期望发布的结果将位于“发布”文件夹中。

发布文件夹结构和令人困惑的发布文件夹