Tidak dapat membuat migrasi setelah memutakhirkan ke ASP.NET Core 2.0

109

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();
}
ruhm
sumber
3
Mungkin masalahnya bukan di Program.cs. Ini mungkin penggunaan instruksi untuk memuat data seed di akhir metode Configure Anda: DbInitializer.Initialize (context); Jika Anda memiliki instruksi itu, beri komentar: //DbInitializer.Initialize(context); Kemudian jalankan instruksi Migrasi untuk mengujinya. Jika masalah muncul, tindak lanjuti kelas DbInitializer.cs.
Miguel Torres C
1
Apakah kelas MyContext Anda ada dalam proyek perpustakaan kelas lain?
Orhun
Masalah yang sama di sini, konteks ada di perpustakaan lain. Jika id menambahkan parameter kurang consturctor ke konteks, migrasi berfungsi, tetapi dengan kesalahan yang sama: (Terjadi kesalahan saat memanggil metode 'BuildWebHost' pada kelas 'Program'. Melanjutkan tanpa penyedia layanan aplikasi. Kesalahan: Referensi objek tidak disetel ke sebuah instance dari sebuah objek.)
iBoonZ
Apakah Anda menyelesaikannya pada akhirnya?
Konrad Viltersten
@MiguelTorresC terima kasih atas komentar itu. Saya berkomentar bahwa Metode Pembibitan dan Migrasi saya mulai berfungsi lagi. Terima kasih banyak !!!
Amit Philips

Jawaban:

123

Anda dapat menambahkan kelas yang mengimplementasikan IDesignTimeDbContextFactory di dalam proyek Web Anda.

Berikut ini contoh kode:

public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<CodingBlastDbContext>
{
    public CodingBlastDbContext CreateDbContext(string[] args)
    {
        IConfigurationRoot configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json")
            .Build();
        var builder = new DbContextOptionsBuilder<CodingBlastDbContext>();
        var connectionString = configuration.GetConnectionString("DefaultConnection");
        builder.UseSqlServer(connectionString);
        return new CodingBlastDbContext(builder.Options);
    }
}

Kemudian, buka proyek Database Anda dan jalankan perintah berikut dari baris perintah:

dotnet ef migrations add InitialMigration -s ../Web/

dotnet ef database update -s ../Web/

-s stands for startup project and ../Web/ is the location of my web/startup project.

sumber

jaaso
sumber
2
Saya mendapatkan: File konfigurasi 'appsettings.json' tidak ditemukan dan bukan opsional. Lintasan fisik adalah 'C: \ Users \ XXX \ Documents \ Visual Studio 2017 \ Projects \ XXX \ src \ XXX.Api \ bin \ Debug \ netcoreapp2.0 \ appsettings.json'. Pengaturan aplikasi saya ada di C: \ Users \ XXX \ Documents \ Visual Studio 2017 \ Projects \ XXX \ src \ XXX.Api.
Reft
Pastikan Anda memiliki file appsettings.json yang disetel untuk menyalin lokal harus memperbaiki masalah yang tidak ditemukan
DaImTo
1
Solusi ini memperkenalkan ketergantungan pada Entity Framework ke dalam aplikasi host Anda (dalam kasus saya ini adalah proyek Web). Apakah ada cara untuk menyiasati ini? Saya ingin perpustakaan Repositori saya menyimpan barang-barang EF, dan tidak memperkenalkan EF ke dalam aplikasi web.
Banoona
Meskipun ini adalah jawaban yang diterima, yang ini lebih baik: stackoverflow.com/a/52671330/1737395 Memang, menjalankan migrasi dengan --verbose flag sangat membantu
barbara.post
73

Tidak perlu IDesignTimeDbContextFactory.

Lari

add-migration initial -verbose

yang akan mengungkapkan detail di bawah

Terjadi kesalahan saat mengakses IWebHost di kelas 'Program'. Melanjutkan tanpa penyedia layanan aplikasi.

peringatan, yang merupakan akar penyebab masalah.

Dalam kasus saya , masalahnya adalah, memiliki ApplicationRole : IdentityRole<int>dan memanggil services.AddIdentity<ApplicationUser, IdentityRole>()yang menyebabkan kesalahan di bawah ini

System.ArgumentException: GenericArguments[1], 'Microsoft.AspNetCore.Identity.IdentityRole', 
on 'Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore`9[TUser,TRole,TContext,
TKey,TUserClaim,TUserRole,TUserLogin,TUserToken,TRoleClaim]' violates the constraint of type 'TRole'.
---> System.TypeLoadException: GenericArguments[1], 'Microsoft.AspNetCore.Identity.IdentityRole', 
on 'Microsoft.AspNetCore.Identity.UserStoreBase`8[TUser,TRole,TKey,TUserClaim,
TUserRole,TUserLogin,TUserToken,TRoleClaim]' violates the constraint of type parameter 'TRole'.
tchelidze.dll
sumber
3
Ya -Verbose membantu untuk benar-benar mengungkap masalah yang sebenarnya. Dalam kasus saya belum menambahkan layanan AddDbContext ke startup.
sudhakarssd
3
migrasi dotnet ef menambahkan InitialCreate --verbose
barbara.post
4
@tchelidze Terima kasih untuk itu, dalam kasus saya, saya tidak memiliki konstruktor tanpa parameter di ApplicationDbContext saya.
Tiago Ávila
1
Ini adalah tip yang fantastis, seharusnya jawaban yang diterima
Avrohom Yisroel
1
Terima kasih banyak, ini membantu saya menemukan masalah saya dan menyelesaikannya. Dalam kasus saya, itu adalah "Tidak ada konstruktor tanpa parameter yang ditentukan untuk tipe 'Data.Access.DAL.MainDbContext'.", Dan oleh karena itu, saya baru saja menghapus parameter dari konstruktor dan bekerja seperti ajaib!
Sarah
25

Solusi 1: (Temukan masalah dalam 99% kasus)

Setel proyek Aplikasi Web sebagai Proyek Startup

Jalankan perintah berikut dengan -verboseopsi.

Add-Migration Init -Verbose

-verbose opsi membantu untuk benar-benar mengungkap masalah sebenarnya, Ini berisi kesalahan rinci.

Solusi 2:

Ubah nama BuildWebHost()menjadi CreateWebHostBuilder(), karena Entity Framework Core toolsberharap menemukan CreateHostBuildermetode yang mengonfigurasi host tanpa menjalankan aplikasi.

.NET Core 2.2

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
} 

.NET Core 3.1

Ganti nama BuildWebHost()menjadiCreateHostBuilder()

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

Solusi 3:

Pastikan Anda menambahkan Dbcontextke injeksi ketergantungan: AddDbContext<TContext>akan membuat jenis DbContext Anda TContext, dan yang sesuai DbContextOptions<TContext>tersedia untuk injeksi dari penampung layanan. Ini membutuhkan penambahan argumen konstruktor ke DbContexttipe Anda yang menerima DbContextOptions<TContext>.

Contoh: Di Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<AppDbContext>(options => options.UseSqlServer(connectionString));
}

Kode AppDbContext :

public class AppDbContext: DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options)
      :base(options)
    { }

}
Ali Bayat
sumber
1
Ini berhasil untuk saya. Mengubah fungsi BuildWebHost di Program.cs dari public static IWebHostBuilder BuildWebHost(string[] args)menjadi public static IWebHost BuildWebHost(string[] args)dengan .Build()sekarang termasuk dalam fungsi
zola25
1
Teman-teman, jika Anda menggunakan ASP.NET Core 2.1+, metode BuildWebHost Anda akan memiliki nama yang berbeda - CreateWebHostBuilder karena docs.microsoft.com/en-us/aspnet/core/migration/… jadi ganti nama CreateWebHostBuilder menjadi BuildWebHost dan migrasi akan ditemukan BuildWebHost dan ambil DbContext darinya.
KEMBL
2
Terima kasih sobat, Diselesaikan setelah menghabiskan 2 jam untuk mengkonfigurasi tanpa menggunakanIDesignTimeDbContextFactory
Azri Zakaria
3
Terima kasih atas panji "-Verbose". Ini telah membantu saya menemukan akar penyebab pengecualian.
Sergey_T
21
public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
    }
}

Ubah saja namanya BuildWebHost()menjadi CreateWebHostBuilder(), karena migrasi menggunakan metode ini secara default.

sherox
sumber
4
APA. Ini harus diiklankan di setiap halaman yang berhubungan dengan masalah ini apakah Anda serius . Sukses instan. Terima kasih.
Chaim Eliyah
Selamatkan hariku !!! Ini adalah kesalahan yang sangat aneh. Saya menggunakan .net core 3.0 dengan pratinjau 7 dan kesalahan ini masih ada
D Todorov
@DTodorov membaca ini devblogs.microsoft.com/dotnet/...
sherox
D Todorov Ubah saja nama BuildWebHost () menjadi CreateHostBuilder ()
Ali Bayat
1
@WernerCD Cuz Worker menggunakan metode CreateHostBuilder () yang mengimplementasikan IHostBuilder dari Net Core 3
sherox
11

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.

"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."

Saya berhasil menambahkan migrasi setelah menetapkan Mvc sebagai satu-satunya proyek startup dan memilih Dal di Package Manager Console.

Gürol Mehmet Çetin
sumber
1
Terima kasih, hal yang sama terjadi pada saya. Saya harus mengubah proyek startup ke tempat kelas Startup / Program ada. Pesan kesalahan adalah lelucon yang buruk.
Ľuboš Čurgó
1
Pesan keluaran benar-benar membuat frustrasi. Saya tidak memilih proyek startup, secara tidak terduga. Inilah alasan mengapa dbContext tidak dapat dibuat. Terima kasih.
upkit
1
Terima kasih tuan ... Banyak waktu saya dihemat
Naveed Khan
7

Di AppContext.cs selain kelas AppContext tambahkan kelas lain:

// required when local database deleted
public class ToDoContextFactory : IDesignTimeDbContextFactory<AppContext>
{
    public AppContext CreateDbContext(string[] args)
    {
        var builder = new DbContextOptionsBuilder<AppContext>();
          builder.UseSqlServer("Server=localhost;Database=DbName;Trusted_Connection=True;MultipleActiveResultSets=true");
        return new AppContext(builder.Options);
    }
}

Ini akan menyelesaikan masalah kedua Anda:

"Tidak dapat membuat objek berjenis 'MyContext'. Tambahkan implementasi 'IDesignTimeDbContextFactory' ke proyek,

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

terjadi saat memanggil metode 'BuildWebHost' pada kelas 'Program' ... Login gagal. Login gagal untuk pengguna '...' "

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.

borisdj
sumber
4

harap verifikasi bahwa Anda memiliki referensinya

<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.0" />
Vladmir
sumber
5
Saya menggunakan <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />yang menyertakan referensi itu. Saya coba juga termasuk di atas, tapi tidak ada perubahan.
ruhm
4

Anda dapat mencoba solusi ini dari diskusi ini , yang terinspirasi oleh posting ini .

public static IWebHost MigrateDatabase(this IWebHost webHost)
{
    using (var scope = webHost.Services.CreateScope())
    {
        var services = scope.ServiceProvider;

        try
        {
            var db = services.GetRequiredService<MyContext>();
            db.Database.Migrate();
        }
        catch (Exception ex)
        {
            var logger = services.GetRequiredService<ILogger<Program>>();
            logger.LogError(ex, "An error occurred while migrating the database.");
        }
    }

    return webHost;
}
public static void Main(string[] args)
{
    BuildWebHost(args)
        .MigrateDatabase()
        .Run();
}
pengguna2771704
sumber
2
Saya masih mendapatkan: Tambahkan implementasi 'IDesignTimeDbContextFactory <DatabaseContext>' ......
Reft
4

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. "

Rtype
sumber
Terima kasih, ini membantu saya juga.
Sergey
3

Dari

https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dbcontext-creation

Saat Anda membuat aplikasi ASP.NET Core 2.0 baru, hook ini disertakan secara default. Dalam versi EF Core dan ASP.NET Core sebelumnya, alat mencoba untuk memanggil Startup.ConfigureServices secara langsung untuk mendapatkan penyedia layanan aplikasi, tetapi pola ini tidak lagi berfungsi dengan benar di aplikasi ASP.NET Core 2.0. Jika Anda mengupgrade aplikasi ASP.NET Core 1.x ke 2.0, Anda dapat memodifikasi kelas Program Anda untuk mengikuti pola baru.

Tambahkan Pabrik di .Net Core 2.x

public class BloggingContextFactory : IDesignTimeDbContextFactory<BloggingContext>
    {
        public BloggingContext CreateDbContext(string[] args)
        {
            var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
            optionsBuilder.UseSqlite("Data Source=blog.db");

            return new BloggingContext(optionsBuilder.Options);
        }
    }
Anton Swanevelder
sumber
3

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

Ali Ahmadi
sumber
Terima kasih, satu-satunya solusi yang berhasil bagi saya adalah menetapkan proyek web sebagai proyek startup dan itulah yang perlu dilakukan.
pengguna3012760
3

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.

codeYouLaterBro
sumber
2

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;

public static void Main(string[] args)
{
    var host = BuildWebHost(args);

    using (var scope = host.Services.CreateScope())
    {
        var services = scope.ServiceProvider;
        try
        {
            var context = services.GetRequiredService<MyDbConext>();
            DbInitializer.Initialize(context);
        }
        catch (Exception ex)
        {
            var logger = services.GetRequiredService<ILogger<Program>>();
            logger.LogError(ex, "An error occurred while seeding the database.");
        }
    }

    host.Run();
}

Miguel Torres C.
sumber
2

Dalam kasus saya, saya mendapat masalah karena saya memiliki metode bernama SeedData.EnsurePopulated () yang dipanggil pada file Startup.cs saya .

public class Startup
{
    public Startup(IConfiguration configuration) => Configuration = configuration;
    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        //
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseDeveloperExceptionPage();
        app.UseStatusCodePages();
        app.UseStaticFiles();
        app.UseSession();
        app.UseMvc(routes =>
        {
            //
        });

        SeedData.EnsurePopulated(app);
    }
}

Pekerjaan kelas SeedData adalah menambahkan data awal ke tabel database. Kode itu adalah:

public static void EnsurePopulated(IApplicationBuilder app)
    {
        ApplicationDbContext context = app.ApplicationServices.GetRequiredService<ApplicationDbContext>();
        context.Database.Migrate();
        if (!context.Products.Any())
        {
            context.Products.AddRange(
            new Product
            {
                Name = "Kayak",
                Description = "A boat for one person",
                Category = "Watersports",
                Price = 275
            },
            ....
            );
            context.SaveChanges();
        }
    }

LARUTAN

Sebelum melakukan migrasi, cukup beri komentar pemanggilan kelas SeedData di file Startup.cs.

// SeedData.EnsurePopulated(app);

Itu menyelesaikan masalah saya dan berharap masalah Anda juga diselesaikan dengan cara yang sama.

yogihosting
sumber
1

Saya mengalami masalah yang sama. Saya memiliki dua proyek dalam solusinya. yang

  1. API
  2. Layanan dan repo, yang memegang model konteks

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:

buka penjelajah solusi >> klik kanan pada proyek konteks >> pilih Setel sebagai proyek Startup

Vikas
sumber
1

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

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection"), x => x.MigrationsAssembly("<Your Project Assembly name where DBContext class resides>")));
immirza
sumber
1

Menggunakan ASP.NET Core 3.1 dan EntityFrameWorkCore 3.1.0. Mengganti OnConfiguring kelas konteks dengan hanya konstruktor tanpa parameter

```protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            IConfigurationRoot configuration = new ConfigurationBuilder()
               .SetBasePath(Directory.GetCurrentDirectory())
               .AddJsonFile("appsettings.json")
               .Build();
            var connectionString = configuration.GetConnectionString("LibraryConnection");
            optionsBuilder.UseSqlServer(connectionString);
        }
    }
```
Francis
sumber
1

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

 dotnet ef migrations add InitialMigration --project "Blog.Infrastructure" --startup-project "Blog.Appication"

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.

dotnet ef database update --project "Blog.Infrastructure" --startup-project "Blog.Application"
Manzur Alahi
sumber
0

Saya mendapat masalah yang sama karena saya merujuk pada Microsoft.EntityFrameworkCore.Tools.DotNet

<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.0" />

Setelah memutakhirkan ke versi yang lebih baru itu diselesaikan

vinayak hegde
sumber
0

Dalam file appsettings.json proyek utama, saya telah mengatur 'Salin ke direktori Output' menjadi "Salin selalu" dan berhasil.

geet
sumber
0

Contoh kelas konteks DB untuk aplikasi konsol inti .net

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration;
using System.IO;

namespace EmailServerConsole.Data
{
    public class EmailDBContext : DbContext
    {
        public EmailDBContext(DbContextOptions<EmailDBContext> options) : base(options) { }
        public DbSet<EmailQueue> EmailsQueue { get; set; }
    }

    public class ApplicationContextDbFactory : IDesignTimeDbContextFactory<EmailDBContext>
    {
        EmailDBContext IDesignTimeDbContextFactory<EmailDBContext>.CreateDbContext(string[] args)
        {
            IConfigurationRoot configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json")
                .Build();
            var builder = new DbContextOptionsBuilder<EmailDBContext>();
            var connectionString = configuration.GetConnectionString("connection_string");
            builder.UseSqlServer(connectionString);
            return new EmailDBContext(builder.Options);
        }
    }
}
Isanka Thalagala
sumber
Meskipun ini mungkin menjawab pertanyaan penulis, ini kekurangan beberapa kata yang menjelaskan dan tautan ke dokumentasi. Potongan kode mentah tidak terlalu membantu tanpa beberapa frase di sekitarnya. Anda juga mungkin menemukan cara menulis jawaban yang bagus sangat membantu. Harap edit jawaban Anda.
hellow
0

Anda juga dapat menggunakan konstruktor kelas startup untuk menambahkan file json (tempat string koneksi berada) ke konfigurasi. Contoh:

    IConfigurationRoot _config;
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json");

        _config = builder.Build();
    }
Vio
sumber
0

Bagi saya itu karena saya mengubah Output Typeproyek startup saya dari Console Applicationmenjadi Class Library.

Kembali ke Console Applicationmelakukan trik.

Robouste
sumber
0

Saya mengalami masalah ini dalam solusi yang memiliki:

  • sebuah proyek .NET Core 2.2 MVC
  • sebuah proyek .NET Core 3.0 Blazor
  • Konteks DB dalam proyek perpustakaan kelas .NET Standard 2.0

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

tomRedox
sumber
0

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.

mark_h
sumber
0

Dalam kasus saya, pengaturan proyek StartUp di init membantu. Anda dapat melakukan ini dengan menjalankan

dotnet ef migrations add init -s ../StartUpProjectName
B. Kosmowski
sumber
-4

Saya memiliki masalah yang sama. Baru saja mengubah ap.jason menjadi application.jason dan masalah tersebut telah diperbaiki

AliAzra
sumber