Entity Framework Core с WPF Core - невозможно добавить миграции
Недавно я перенес свое приложение WPF (.NET 4.7) на.Net Core 3.1. Большая часть из них работает нормально, за исключением того, что я не могу создавать / добавлять миграции EF Core.
Я интегрировал свой dbContext
/ EF Core с помощью следующих сообщений с использованием внедрения зависимостей:
- https://marcominerva.wordpress.com/2019/03/06/using-net-core-3-0-dependency-injection-and-service-provider-with-wpf/
- https://marcominerva.wordpress.com/2019/03/19/using-entity-framework-core-with-wpf-on-net-core-3-0/
База данных подключается и работает правильно. Однако, когда я пытаюсь добавить миграции, набирая следующую команду:Add-Migration InitialMigration
Я получаю следующую ошибку:
Невозможно создать объект типа MyDBContext. Чтобы узнать о различных шаблонах, поддерживаемых во время разработки, см. https://go.microsoft.com/fwlink/?linkid=851728.
В веб-приложениях это обычная / известная проблема, которую можно исправить, изменив CreateHostBuilder
к BuildWebHost
в программном классе; https://stackru.com/questions/57745481/unable-to-create-an-object-of-type-mycontext-for-the-different-patterns-suppo
Я также нашел несколько других сообщений, добавив MigrationsAssembly
в options.UseSqlServer
.
Короче говоря, я пробовал все эти решения, но ни одно из них не работает. Вероятно, потому что мое приложение не является веб-приложением (без класса программы, например, BuildWebHost), а является приложением WPF (Core).
Мой код инициализации для приложения WPF выглядит следующим образом:
App.xaml.cs
public partial class App : Application
{
private readonly IHost host;
public IServiceProvider ServiceProvider { get; private set; }
public IConfiguration Configuration { get; private set; }
public App()
{
host = Host.CreateDefaultBuilder()
.ConfigureServices((context, services) =>
{
ConfigureServices(services);
}).Build();
}
private void ConfigureServices(IServiceCollection services)
{
// services for DI...
services.AddDbContext<MyDbContext>
(options =>
options.UseSqlServer(
Configuration.GetConnectionString("SqlConnection")));
services.AddTransient<MainWindow>();
}
protected override void OnStartup(StartupEventArgs e)
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
Configuration = builder.Build();
var serviceCollection = new ServiceCollection();
ConfigureServices(serviceCollection);
ServiceProvider = serviceCollection.BuildServiceProvider();
var mainWindow = ServiceProvider.GetRequiredService<MainWindow>();
mainWindow.Show();
}
protected override async void OnExit(ExitEventArgs e)
{
using (host)
{
await host.StopAsync(TimeSpan.FromSeconds(5));
}
base.OnExit(e);
}
}
MyDbContext.cs
public class MyDbContext : DbContext
{
public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
{
Database.Migrate();
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// Zonnescherm Model
modelBuilder.Entity<Zonneschermen>().Property(e => e.BreedteZonnescherm).HasColumnType("decimal(17,2)");
modelBuilder.Entity<Zonneschermen>().Property(e => e.UitvalDoek).HasColumnType("decimal(17,2)");
modelBuilder.Entity<Zonneschermen>().Property(e => e.ArmLengte).HasColumnType("decimal(17,2)");
// ScreenRegels Model
modelBuilder.Entity<ScreenRegels>().Property(e => e.Breedte).HasColumnType("decimal(17,2)");
modelBuilder.Entity<ScreenRegels>().Property(e => e.Hoogte).HasColumnType("decimal(17,2)");
modelBuilder.Entity<ScreenRegels>().Property(e => e.DraaistangLengte).HasColumnType("decimal(17,2)");
// Seed
modelBuilder.Entity<Instellingen>().HasData(
// seeding...
);
// Seed
modelBuilder.Entity<ZonneschermInstellingen>().HasData(
// seeding...
);
// Seed
modelBuilder.Entity<ScreenInstellingen>().HasData(
// seeding...
);
}
public DbSet<Lamellen> Lamellen { get; set; }
public DbSet<LamellenRegels> LamellenRegels { get; set; }
public DbSet<Zonneschermen> Zonneschermen { get; set; }
public DbSet<ZonneschermInstellingen> ZonneschermInstellingen { get; set; }
public DbSet<Screens> Screens { get; set; }
public DbSet<ScreenRegels> ScreenRegels { get; set; }
public DbSet<ScreenInstellingen> ScreenInstellingen { get; set; }
public DbSet<Instellingen> Instellingen { get; set; }
}
Есть какие-нибудь подсказки, где что-то пошло не так?
2 ответа
Только что наткнулся на это сообщение: WPF с структурой сущностей в сетевом ядре - невозможно создать и объект типа AppDbContext
который решает ту же проблему. Достаточно забавно, что я не получил это в качестве результата поиска в моей поисковой системе DuckDuckGo, но это был первый успех в моей поисковой системе Google...
для .net core 5 (не уверен, что это работает для более ранней версии)
просто добавьте этот класс в свой проект
public class BloggingContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext>
{
public ApplicationDbContext CreateDbContext(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
optionsBuilder.UseSqlServer("your connection string",
options => options.EnableRetryOnFailure());
return new ApplicationDbContext(optionsBuilder.Options);
}
}
ссылка на документацию https://docs.microsoft.com/en-us/ef/core/cli/dbcontext-creation?tabs=dotnet-core-cli#from-a-design-time-factory