Предыдущий способ написания кода (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);
Это простотак же, как делать все это в веб-приложении, так что вы можете добавить любой тип конфигурации, который вам нравится.