.Net Core 2.1 Web и консоль DbContexts - PullRequest
0 голосов
/ 06 июня 2018

Я не известен своей ясностью при задании вопросов, так что, извините, у меня нет никакой формальной подготовки по этому вопросу, но я в замешательстве.

Я нахожусь в процессе обновления с .Net 4.7.1 до .NetCore 2.1, мое решение состоит из 2 частей: веб-приложения IIS для MVC и консольного приложения, приложение IIS отображает данные, а консольное приложение выполняет всю фактическую обработку.

До того, как я запустил этот порт длямое консольное приложение, когда мне нужно было что-то из базы данных, я бы просто

using (var db = new ApplicationDbContext())
{
    SomethingModel model = db.X.First(x => x.Whatever == whatever);
}

И точно так же у меня есть данные, которые я хочу получить из базы данных, но как вы думаете, я могу сделать это с Core 2.1, черт возьми?.

Я перенес весь код, все ссылки разрешены и, насколько я могу судить, готов к работе.За исключением того, что я не могу вызвать данные из базы данных, и я в замешательстве, Google просто показывает код в первую очередь и прочее, или я не знаю, о чем я на самом деле спрашиваю.

Так что если кто-то может помочь, его очень ценят

- Обновление 1 ---

Ошибка: ссылка на объект требуется для нестатического поля, мето или свойства Program._db

DbModel определен в Data / ApplicationDbContext.csдля приложения IIS и выглядит следующим образом:

public ApplicationDbContext(DbContextOptions<ApplicationDbContext>
options)
            : base(options)
         {
         }

- Program.cs для консольного приложения

 class Program
    {
        private ApplicationDbContext _db { get; }
        public Program(ApplicationDbContext context)
        {
            _db = context;
        }
        static void Main(string[] args)
        {
            new ExecutionEngine(_db).Run();
        }
    }

1 Ответ

0 голосов
/ 06 июня 2018

Предыдущий способ написания кода (using) был никогда хорошей идеей.Ваш контекст должен быть ограничен запросом;использование using может привести к всевозможным проблемам с отслеживанием сущностей и полностью разрушит все полезное кэширование EF.Наилучшим способом получения экземпляра контекста всегда было внедрение зависимостей через контейнер DI.

В ASP.NET Core для всех используется внедрение зависимостей, и из-за этого DbContext EF Core разработан быть введены зависимости.В связи с этим он больше не использует конструктор по умолчанию из коробки, поэтому ваш старый код дает сбой (это зависит от того, существует ли конструктор по умолчанию).

Длинно и коротко, делайте все правильно и вставляйтеваш контекст.Похоже, вы пытаетесь сделать это на основе вашего обновления.Тем не менее, вы не можете ввести что-то вроде Program.Это точка входа для вашего приложения, что означает, что буквально ничего еще не существует.Если вы посмотрите на свое веб-приложение, то заметите, что Program там настраивает компоновщик веб-хоста (используя Startup), а затем собирает и запускает его.За кулисами это делает кучу вещей, включая настройку коллекции сервисов.Это то, что вам нужно сделать в консольном приложении (настроить набор сервисов).Это относительно просто:

class Program
{
    static void Main(string[] args)
    {
        var serviceProvider = new ServiceCollection()
            .AddDbContext<ApplicationDbContext>(o =>
                o.UseSqlServer("connection string"))
            .BuildServiceProvider();

        var context = serviceProvider.GetRequiredService<ApplicationDbContext>();

        new ExecutionEngine(context).Run();
    }
}

Теперь, это немного излишне просто из-за кода, который вы здесь собрали.Вы можете просто обновить экземпляр своего контекста с помощью DbContextOptionsBuilder:

var options = new DbContextOptionsBuilder<ApplicationDbContext>()
    .UseSqlServer("connection string")
    .Options;
var context = new ApplicationDbContext(options);

Однако использование набора служб позволяет обрабатывать более сложные сценарии и лучше повторно использовать экземпляры таких вещей, как ваш контекст, в базе кода.,Также стоит отметить, что вам, вероятно, следует подумать об интеграции провайдеров конфигурации, чтобы вам не нужно было жестко кодировать строку подключения.Это также относительно просто:

var config = new ConfigurationBuilder()
    .SetBasePath(Path.Combine(AppContext.BaseDirectory))
    .AddJsonFile("appsettings.json", optional: true)
    .Build();

Возможно, вы захотите добавить конфигурацию для конкретной среды:

var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

Тогда:

.AddJsonFile($"appsettings.{environment}.json", optional: true);

Это простотак же, как делать все это в веб-приложении, так что вы можете добавить любой тип конфигурации, который вам нравится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...