EF Core DBContext внутри Net Core Worker Windows сервис - PullRequest
0 голосов
/ 15 января 2020

я пытаюсь достичь простого кода. 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
)

1 Ответ

0 голосов
/ 15 января 2020

Мне пришлось установить опубликованные источники папки win-x64, а не папки "publi sh", чтобы это действительно работало. Несмотря на то, что моя целевая среда выполнения была win-x64, из-за чего я ожидал, что опубликованный результат будет в папке "publi sh".

Структура структуры выпуска и сбивающий с толку publi sh папка

...