#asp.net #entity-framework #asp.net-core #entity-framework-core #asp.net-core-mvc
Вопрос:
я хочу автоматически применять миграции для своего приложения, поэтому я использовал этот метод
База данных.Миграция()
Применяет все отложенные миграции для контекста к базе данных. Создаст базу данных, если она еще не существует.
итак, как я понял, когда я запускаю свое приложение, оно должно делать следующее: 1 — создать базу данных, если она не существует 2 — обновить базу данных => применить миграцию к базе данных
но когда я запускаю свой проект, ничего не происходит, я пишу команду вручную, чтобы применить базу данных, и это работает, но я не знаю, в чем проблема
это мой код
DbContext
using Microsoft.Extensions.Configuration;
using Microsoft.EntityFrameworkCore;
using brokerTest.Entites;
namespace brokerTest.Brokers.Sotrage
{
public class StorageBroker : DbContext , IStorageBroker
{
private readonly IConfiguration configuration;
public StorageBroker(IConfiguration configuration)
{
this.configuration = configuration;
this.Database.Migrate();
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){
var connectionString = this.configuration.GetConnectionString("DefaultConnection");
optionsBuilder.UseSqlServer(connectionString);
}
public DbSet<User> Users { get; set; }
}
}
startup.cs
services.AddDbContext<StorageBroker>();
services.AddScoped<IStorageBroker, StorageBroker>();
appsettingfile.json
{
"ConnectionStrings": {
"DefaultConnection": "server=(localdb)\MSSQLLocalDB;Database=testDb"
},
Пакет установлен
.NET 6 , Microsoft.EntityFrameworkCore.Дизайн 5.0.8
Майкрософт.EntityFrameworkCore.SQLServer 5.0.8
Комментарии:
1. Ваш вопрос имеет мало общего с ASP.Net. Я предлагаю вам пометить его соответствующей версией Entity Framework.
2. Применяйте миграции во время выполнения
3. @Sasan могу ли я сделать это в классе DbContext, который я создал ? как и приведенный выше код, и что не так с моим кодом, если таковые имеются
4. Конструктор будет запускаться каждый раз при создании нового DbContext. Применение производственных миграций-это то, что требует тщательной стратегии (или существует вероятность потери данных или, что еще хуже, сбоя программы). Даже Microsoft Docs не рекомендует этого делать, но если вам это все равно нужно, то это следует сделать один раз при запуске программы.
5. @Sasan спасибо , я уже читал, что в документах я просто использовал его в целях разработки, и я обнаружил ошибку в своем коде, и я публикую ответ на том же посту здесь,
Ответ №1:
я обнаружил, что класс DbContext вообще не вызывался, потому что я не вводил его с помощью какого-либо контроллера или класса
после того, как я введу DbContext в свой класс контроллера
[ApiController]
[Route("/home")]
public class HomeController : Controller
{
private readonly IStorageBroker _storageBrodker;
public HomeController(IStorageBroker storageBroker)
{
_storageBrodker = storageBroker;
}
когда я вызываю класс route /home, то применяются миграции
я думал, что это называется, потому что я регистрирую его в службах, но я не знал, что это называется, когда нужно решить
и комментарий для Sasan предоставляет другой способ сделать это из main при построении объекта IHost https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/applying?tabs=dotnet-core-cli#apply-migrations-at-runtime