Setelah memutakhirkan ke ASP.NET Core 2.0, sepertinya saya tidak dapat membuat migrasi lagi.
Saya mendapatkan
"Terjadi kesalahan saat memanggil metode 'BuildWebHost' pada kelas 'Program'. Melanjutkan tanpa penyedia layanan aplikasi. Kesalahan: Satu atau lebih kesalahan terjadi. (Tidak dapat membuka database" ... "yang diminta oleh proses masuk. Login gagal. Login gagal untuk pengguna '...' "
dan
"Tidak dapat membuat objek jenis 'MyContext'. Tambahkan implementasi 'IDesignTimeDbContextFactory' ke proyek, atau lihat https://go.microsoft.com/fwlink/?linkid=851728 untuk pola tambahan yang didukung pada waktu desain."
Perintah yang saya jalankan sebelumnya adalah $ dotnet ef migrations add InitialCreate --startup-project "..\Web"
(dari proyek / folder dengan DBContext).
String koneksi: "Server=(localdb)\\mssqllocaldb;Database=database;Trusted_Connection=True;MultipleActiveResultSets=true"
Ini adalah Program.cs saya
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
Jawaban:
Anda dapat menambahkan kelas yang mengimplementasikan IDesignTimeDbContextFactory di dalam proyek Web Anda.
Berikut ini contoh kode:
Kemudian, buka proyek Database Anda dan jalankan perintah berikut dari baris perintah:
sumber
sumber
Tidak perlu
IDesignTimeDbContextFactory
.Lari
add-migration initial -verbose
yang akan mengungkapkan detail di bawah
peringatan, yang merupakan akar penyebab masalah.
Dalam kasus saya , masalahnya adalah, memiliki
ApplicationRole : IdentityRole<int>
dan memanggilservices.AddIdentity<ApplicationUser, IdentityRole>()
yang menyebabkan kesalahan di bawah inisumber
Solusi 1: (Temukan masalah dalam 99% kasus)
Setel proyek Aplikasi Web sebagai Proyek Startup
Jalankan perintah berikut dengan
-verbose
opsi.Solusi 2:
Ubah nama
BuildWebHost()
menjadiCreateWebHostBuilder()
, karenaEntity Framework Core tools
berharap menemukanCreateHostBuilder
metode yang mengonfigurasi host tanpa menjalankan aplikasi..NET Core 2.2
.NET Core 3.1
Ganti nama
BuildWebHost()
menjadiCreateHostBuilder()
Solusi 3:
Pastikan Anda menambahkan
Dbcontext
ke injeksi ketergantungan:AddDbContext<TContext>
akan membuat jenis DbContext AndaTContext
, dan yang sesuaiDbContextOptions<TContext>
tersedia untuk injeksi dari penampung layanan. Ini membutuhkan penambahan argumen konstruktor keDbContext
tipe Anda yang menerimaDbContextOptions<TContext>
.Contoh: Di Startup.cs
Kode AppDbContext :
sumber
public static IWebHostBuilder BuildWebHost(string[] args)
menjadipublic static IWebHost BuildWebHost(string[] args)
dengan.Build()
sekarang termasuk dalam fungsiIDesignTimeDbContextFactory
Ubah saja namanya
BuildWebHost()
menjadiCreateWebHostBuilder()
, karena migrasi menggunakan metode ini secara default.sumber
Dalam kasus saya, penyebab masalahnya adalah beberapa proyek startup. Saya memiliki tiga proyek dalam solusi saya: Mvc, Api, dan Dal. DbContext dan Migrasi dalam proyek Dal.
Saya telah mengonfigurasi beberapa proyek startup. Baik proyek Mvc dan Api sedang berjalan ketika saya mengklik Mulai. Tetapi dalam kasus ini saya mendapatkan kesalahan ini.
Saya berhasil menambahkan migrasi setelah menetapkan Mvc sebagai satu-satunya proyek startup dan memilih Dal di Package Manager Console.
sumber
Di AppContext.cs selain kelas AppContext tambahkan kelas lain:
Ini akan menyelesaikan masalah kedua Anda:
Setelah itu Anda akan dapat menambahkan-migrasi Initial dan menjalankannya dengan menjalankan perintah update-database . Namun jika menjalankan perintah ini ketika belum ada DatabaseBase di SqlServer lokal Anda, Anda akan mendapatkan peringatan seperti kesalahan pertama Anda: "Kesalahan
Tetapi ini bukan kesalahan karena migrasi akan dibuat dan dapat dijalankan. Jadi abaikan saja kesalahan ini untuk pertama kalinya, dan yang terakhir karena Db akan ada, itu tidak akan terjadi lagi.
sumber
harap verifikasi bahwa Anda memiliki referensinya
sumber
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />
yang menyertakan referensi itu. Saya coba juga termasuk di atas, tapi tidak ada perubahan.Anda dapat mencoba solusi ini dari diskusi ini , yang terinspirasi oleh posting ini .
sumber
Sesuatu yang sangat membantu saya adalah artikel ini: https://elanderson.net/2017/09/unable-to-create-an-object-of-type-applicationdbcontext-add-an-implementation-of-idesigntimedbcontextfactory/
Ide dasarnya adalah bahwa dalam perubahan dari .net core 1 ke 2 semua inisialisasi db harus dipindahkan dari StartUp.cs dan ke Program.cs. Jika tidak, tugas EF mencoba dan menjalankan init DB Anda saat melakukan tugas.
"Ada bagian yang bagus di dokumen migrasi resmi ( https://docs.microsoft.com/en-us/ef/core/miscellaneous/1x-2x-upgrade ) berjudul" Pindahkan kode inisialisasi database "yang sepertinya saya miliki tidak terjawab. Jadi sebelum Anda menuju lubang kelinci seperti yang saya lakukan, pastikan bukan ini yang menyebabkan Anda perlu menambahkan implementasi IdesignTimeDbContextFactory. "
sumber
Dari
https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dbcontext-creation
Tambahkan Pabrik di .Net Core 2.x
sumber
Saya memiliki masalah ini dan ini diselesaikan Dengan Set -> Aplikasi Web (Termasuk Program.cs) Proyek ke -> "Set as Startup Project"
Kemudian jalankan -> tambahkan-migrasi awal -verbose
di Package Manager Console
Tetapkan sebagai Proyek Startup
sumber
Jika Anda ingin menghindari hal IDesignTimeDbContextFactory: Pastikan Anda tidak menggunakan metode Seed apa pun dalam startup Anda. Saya menggunakan metode seed statis di startup saya dan itu menyebabkan kesalahan ini bagi saya.
sumber
Sebelumnya, Anda mengonfigurasi data seed dalam metode Configure di Startup.cs. Sekarang Anda disarankan untuk menggunakan metode Configure hanya untuk menyiapkan pipeline permintaan. Kode startup aplikasi termasuk dalam metode Utama.
Metode Utama yang difaktorkan ulang. Tambahkan referensi berikut ke Program.cs:
menggunakan Microsoft.Extensions.DependencyInjection;
menggunakan MyProject.MyDbContextFolder;
sumber
Ada masalah dengan ef seeding db dari Startup. Konfigurasi di 2.0 ... Anda masih dapat melakukannya dengan perbaikan ini. Diuji dan bekerja dengan baik
https://garywoodfine.com/how-to-seed-your-ef-core-database/
sumber
Dalam kasus saya, saya mendapat masalah karena saya memiliki metode bernama SeedData.EnsurePopulated () yang dipanggil pada file Startup.cs saya .
Pekerjaan kelas SeedData adalah menambahkan data awal ke tabel database. Kode itu adalah:
LARUTAN
Sebelum melakukan migrasi, cukup beri komentar pemanggilan kelas SeedData di file Startup.cs.
Itu menyelesaikan masalah saya dan berharap masalah Anda juga diselesaikan dengan cara yang sama.
sumber
Saya mengalami masalah yang sama. Saya memiliki dua proyek dalam solusinya. yang
Awalnya, proyek API ditetapkan sebagai proyek Startup.
Saya mengubah proyek Startup menjadi proyek yang memegang kelas konteks. Jika Anda menggunakan Visual Studio, Anda dapat menetapkan proyek sebagai proyek Startup dengan:
sumber
Pertama-tama pastikan Anda telah mengkonfigurasi database Anda di
Startup.cs
Dalam kasus saya, saya mendapatkan kesalahan ini karena saya tidak menentukan di bawah iniStartup.cs
sumber
Menggunakan ASP.NET Core 3.1 dan EntityFrameWorkCore 3.1.0. Mengganti OnConfiguring kelas konteks dengan hanya konstruktor tanpa parameter
sumber
Saya menghadapi kesalahan
"Tidak dapat membuat objek jenis 'MyContext'. Tambahkan implementasi 'IDesignTimeDbContextFactory' ke proyek, atau lihat https://go.microsoft.com/fwlink/?linkid=851728 untuk pola tambahan yang didukung pada waktu desain."
Beginilah masalah saya diselesaikan. Jalankan perintah di bawah ini saat Anda berada di direktori solusi Anda
Di sini Aplikasi adalah proyek startup saya yang berisi kelas Startup.cs & Infrastruktur adalah proyek saya yang berisi kelas DbContext.
lalu jalankan pembaruan menggunakan struktur yang sama.
sumber
Saya mendapat masalah yang sama karena saya merujuk pada Microsoft.EntityFrameworkCore.Tools.DotNet
Setelah memutakhirkan ke versi yang lebih baru itu diselesaikan
sumber
Dalam file appsettings.json proyek utama, saya telah mengatur 'Salin ke direktori Output' menjadi "Salin selalu" dan berhasil.
sumber
Contoh kelas konteks DB untuk aplikasi konsol inti .net
sumber
Anda juga dapat menggunakan konstruktor kelas startup untuk menambahkan file json (tempat string koneksi berada) ke konfigurasi. Contoh:
sumber
Bagi saya itu karena saya mengubah
Output Type
proyek startup saya dariConsole Application
menjadiClass Library
.Kembali ke
Console Application
melakukan trik.sumber
Saya mengalami masalah ini dalam solusi yang memiliki:
Saya mendapatkan pesan "tidak dapat membuat objek ..." ketika proyek Blazor ditetapkan sebagai proyek start up, tetapi tidak jika proyek MVC ditetapkan sebagai proyek startup.
Itu membingungkan saya, karena di Package Manager Console (tempat saya membuat migrasi) saya memiliki proyek Default yang disetel ke pustaka kelas C # yang sebenarnya berisi Konteks DB, dan saya juga menentukan konteks DB di panggilan saya untuk menambahkan-migrasi
add-migration MigrationName -context ContextName
, jadi tampaknya aneh bahwa Visual Studio peduli proyek startup apa yang sedang ditetapkan.Saya menebak alasannya adalah ketika proyek Blazor adalah proyek startup, PMC menentukan versi .NET menjadi Core 3.0 dari proyek startup dan kemudian mencoba menggunakannya untuk menjalankan migrasi pada kelas .NET Standard 2.0 perpustakaan dan mengenai semacam konflik.
Apa pun penyebabnya, mengubah proyek startup ke proyek MVC yang menargetkan Core 2.2, bukan proyek Blazor, memperbaiki masalah
sumber
Bagi saya masalahnya adalah saya menjalankan perintah migrasi di dalam proyek yang salah. Menjalankan perintah di dalam proyek yang berisi Startup.cs daripada proyek yang berisi DbContext memungkinkan saya untuk melewati masalah khusus ini.
sumber
Dalam kasus saya, pengaturan proyek StartUp di init membantu. Anda dapat melakukan ini dengan menjalankan
sumber
Saya memiliki masalah yang sama. Baru saja mengubah ap.jason menjadi application.jason dan masalah tersebut telah diperbaiki
sumber