Không thể tạo di chuyển sau khi nâng cấp lên ASP.NET Core 2.0


109

Sau khi nâng cấp lên ASP.NET Core 2.0, tôi dường như không thể tạo di chuyển nữa.

tôi nhận được

"Đã xảy ra lỗi khi gọi phương thức 'BuildWebHost' trên lớp 'Chương trình'. Tiếp tục mà không có nhà cung cấp dịch vụ ứng dụng. Lỗi: Đã xảy ra một hoặc nhiều lỗi. (Không thể mở cơ sở dữ liệu" ... "do đăng nhập yêu cầu. Đăng nhập không thành công. Đăng nhập không thành công cho người dùng '...' "

"Không thể tạo đối tượng thuộc loại 'MyContext'. Thêm triển khai 'IDesignTimeDbContextFactory' vào dự án hoặc xem https://go.microsoft.com/fwlink/?linkid=851728 để biết thêm các mẫu được hỗ trợ tại thời điểm thiết kế."

Lệnh tôi đã chạy trước đó là $ dotnet ef migrations add InitialCreate --startup-project "..\Web"(từ dự án / thư mục với DBContext).

Chuỗi kết nối: "Server=(localdb)\\mssqllocaldb;Database=database;Trusted_Connection=True;MultipleActiveResultSets=true"

Đây là Chương trình của tôi.cs

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

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

3
Có thể sự cố không nằm trong Program.cs. Nó có thể là việc sử dụng một hướng dẫn để tải dữ liệu hạt giống ở cuối phương pháp Định cấu hình của bạn: DbInitializer.Initialize (context); Nếu bạn có hướng dẫn đó, hãy bình luận nó: //DbInitializer.Initialize(context); Sau đó chạy hướng dẫn Migration để kiểm tra. Nếu sự cố phát sinh, hãy theo dõi trên lớp DbInitializer.cs.
Miguel Torres C

1
Lớp MyContext của bạn có nằm trong dự án thư viện lớp khác không?
Orhun

Vấn đề tương tự ở đây, ngữ cảnh là trong thư viện khác. Nếu id thêm một tham số ít hằng số hơn vào ngữ cảnh, quá trình di chuyển đang hoạt động, nhưng với cùng một lỗi: (Đã xảy ra lỗi khi gọi phương thức 'BuildWebHost' trên lớp 'Chương trình'. Tiếp tục mà không có nhà cung cấp dịch vụ ứng dụng. Lỗi: Không đặt tham chiếu đối tượng đến một thể hiện của một đối tượng.)
iBoonZ

Cuối cùng thì bạn đã giải quyết được chưa?
Konrad Viltersten

@MiguelTorresC cảm ơn vì nhận xét đó. Tôi nhận xét rằng Phương pháp gieo hạt và Di chuyển của tôi đã bắt đầu hoạt động trở lại. Cảm ơn rất nhiều !!!
Amit Philips

Câu trả lời:


123

Bạn có thể thêm một lớp triển khai IDesignTimeDbContextFactory bên trong dự án Web của bạn.

Đây là mã mẫu:

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);
    }
}

Sau đó, điều hướng đến dự án Cơ sở dữ liệu của bạn và chạy dòng lệnh sau:

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.

nguồn


2
Tôi nhận được: Không tìm thấy tệp cấu hình 'appsettings.json' và không phải là tùy chọn. Đường dẫn vật lý là 'C: \ Users \ XXX \ Documents \ Visual Studio 2017 \ Projects \ XXX \ src \ XXX.Api \ bin \ Debug \ netcoreapp2.0 \ appsettings.json'. Cài đặt ứng dụng của tôi có trong C: \ Users \ XXX \ Documents \ Visual Studio 2017 \ Projects \ XXX \ src \ XXX.Api.
Reft

Hãy chắc chắn rằng bạn có tập tin cài đặt appsettings.json để sao chép địa phương cần khắc phục vấn đề với nó không được tìm thấy
DaImTo

1
Giải pháp này đưa sự phụ thuộc vào Entity Framework vào ứng dụng lưu trữ của bạn (trong trường hợp của tôi, đây là một dự án Web). Có cách nào để làm được việc này? Tôi muốn thư viện Kho lưu trữ của mình chứa nội dung EF và không giới thiệu EF vào ứng dụng web.
Banoona

Mặc dù đây là câu trả lời được chấp nhận, điều này là tốt hơn: stackoverflow.com/a/52671330/1737395 Thật vậy, chạy di chuyển với cờ --verbose giúp rất nhiều
barbara.post

73

Không cần IDesignTimeDbContextFactory.

Chạy

add-migration initial -verbose

điều đó sẽ tiết lộ các chi tiết dưới

Đã xảy ra lỗi khi truy cập IWebHost trên lớp 'Chương trình'. Tiếp tục mà không có nhà cung cấp dịch vụ ứng dụng.

cảnh báo, đó là nguyên nhân gốc rễ của vấn đề.

Trong trường hợp của tôi , vấn đề là, có ApplicationRole : IdentityRole<int>và gọi services.AddIdentity<ApplicationUser, IdentityRole>()gây ra lỗi bên dưới

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

3
Có -Verbose giúp thực sự khám phá ra vấn đề thực sự. Trong trường hợp của tôi chưa thêm dịch vụ AddDbContext vào khởi động.
sudhakarssd

3
dotnet ef migrations thêm InitialCreate --verbose
barbara.post

4
@tchelidze Cảm ơn bạn vì điều đó, trong trường hợp của tôi, tôi không có hàm tạo không tham số trong ApplicationDbContext của mình.
Tiago Ávila

1
Đây là một mẹo tuyệt vời, nên câu trả lời chấp nhận
Avrohom Yisroel

1
Cảm ơn bạn rất nhiều, điều này đã giúp tôi tìm ra vấn đề của mình và giải quyết nó. Trong trường hợp của tôi, đó là "Không có hàm tạo không tham số nào được xác định cho kiểu 'Data.Access.DAL.MainDbContext'.", Và do đó, tôi chỉ xóa các tham số khỏi hàm tạo và nó hoạt động như một phép thuật!
Sarah

25

Giải pháp 1: (Tìm vấn đề trong 99% trường hợp)

Đặt dự án Ứng dụng Web làm Dự án Khởi động

Chạy các lệnh sau với -verbosetùy chọn.

Add-Migration Init -Verbose

-verbose tùy chọn giúp phát hiện ra vấn đề thực sự, Nó chứa các lỗi chi tiết.

Giải pháp 2:

Đổi tên BuildWebHost()thành CreateWebHostBuilder(), vì Entity Framework Core toolsmong đợi tìm được CreateHostBuilderphương pháp định cấu hình máy chủ lưu trữ mà không cần chạy ứng dụng.

.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

Đổi tên BuildWebHost()thànhCreateHostBuilder()

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>();
            });
}

Giải pháp 3:

Đảm bảo bạn đã thêm Dbcontextvào phụ thuộc tiêm: AddDbContext<TContext>sẽ làm cho cả loại DbContext của bạn TContextvà loại tương ứng DbContextOptions<TContext>có sẵn để tiêm từ vùng chứa dịch vụ. Điều này yêu cầu thêm một đối số phương thức khởi tạo vào DbContextkiểu chấp nhận của bạn DbContextOptions<TContext>.

Ví dụ: Trong Startup.cs

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

AppDbContext :

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

}

1
Điều này đã làm việc cho tôi. Thay đổi chức năng BuildWebHost trong Program.cs từ public static IWebHostBuilder BuildWebHost(string[] args)đến public static IWebHost BuildWebHost(string[] args)với .Build()hiện nay bao gồm trong hàm
zola25

1
Các bạn ơi, nếu bạn đang sử dụng ASP.NET Core 2.1+ thì phương thức BuildWebHost sẽ có tên khác - CreateWebHostBuilder vì docs.microsoft.com/en-us/aspnet/core/migration/… vì vậy hãy đổi tên CreateWebHostBuilder thành BuildWebHost và việc di chuyển sẽ tìm thấy BuildWebHost và lấy DbContext từ nó.
KEMBL

2
Cảm ơn người bạn đời, giải quyết sau khi chi tiêu 2 giờ để cấu hình mà không sử dụngIDesignTimeDbContextFactory
Azri Zakaria

3
Cảm ơn vì cờ "-Verbose". Nó đã giúp tôi tìm ra nguyên nhân gốc rễ của ngoại lệ.
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();
    }
}

Chỉ cần đổi tên BuildWebHost()thành CreateWebHostBuilder(), vì quá trình di chuyển sử dụng phương pháp này theo mặc định.


4
GÌ. Điều này nên được quảng cáo trên mọi trang liên quan đến vấn đề này bạn có nghiêm túc không . Thành công tức thì. Cảm ơn bạn.
Chaim Eliyah

Hãy cứu lấy ngày của tôi !!! Đó là một lỗi rất lạ. I `m sử dụng .net lõi 3.0 với preview 7 và lỗi này Stil tồn tại
D Todorov


D Todorov Chỉ cần đổi tên BuildWebHost () để CreateHostBuilder ()
Ali Bayat

1
@WernerCD Cuz Worker sử dụng phương thức CreateHostBuilder () triển khai IHostBuilder của Net Core 3
sherox

11

Trong trường hợp của tôi, nguyên nhân của vấn đề là do nhiều dự án khởi động. Tôi có ba dự án trong giải pháp của mình: Mvc, Api và Dal. DbContext và Migrations trong dự án Dal.

Tôi đã định cấu hình nhiều dự án khởi động. Cả hai dự án Mvc và Api đều đang chạy khi tôi nhấp vào Bắt đầu. Nhưng trong trường hợp này tôi đã nhận được lỗi này.

"Không thể tạo đối tượng thuộc loại 'MyContext'. Thêm triển khai 'IDesignTimeDbContextFactory' vào dự án hoặc xem https://go.microsoft.com/fwlink/?linkid=851728 để biết thêm các mẫu được hỗ trợ tại thời điểm thiết kế."

Tôi có thể thêm di chuyển thành công sau khi đặt Mvc làm dự án khởi động duy nhất và chọn Dal trong Bảng điều khiển trình quản lý gói.


1
Cảm ơn bạn, điều tương tự đã xảy ra với tôi. Tôi đã phải thay đổi dự án khởi động thành nơi tồn tại các lớp Khởi động / Chương trình. Thông báo lỗi là một trò đùa tồi tệ.
Ľuboš Čurgó

1
Tin nhắn đầu ra thực sự gây khó chịu. Tôi không có dự án khởi nghiệp nào được chọn, thật bất ngờ. Đây là lý do tại sao không thể tạo dbContext. Cảm ơn.
upkit

1
Cảm ơn bạn sir ... Rất nhiều thời gian của tôi được lưu
Naveed Khan

7

Trong AppContext.cs ngoài lớp AppContext, hãy thêm một lớp khác:

// 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);
    }
}

Điều này sẽ giải quyết vấn đề thứ hai của bạn:

"Không thể tạo đối tượng kiểu 'MyContext'. Thêm triển khai 'IDesignTimeDbContextFactory' vào dự án,

Sau đó, bạn sẽ có thể bổ sung Ban đầu và thực thi nó bằng cách chạy lệnh update-database . Tuy nhiên, nếu chạy các lệnh này khi chưa có DataBase trong SqlServer cục bộ của bạn, bạn sẽ nhận được cảnh báo giống như lỗi đầu tiên của bạn: "Lỗi

xảy ra khi gọi phương thức 'BuildWebHost' trên lớp 'Chương trình' ... Đăng nhập không thành công. Đăng nhập không thành công cho người dùng '...' "

Nhưng nó không phải là lỗi vì quá trình di chuyển sẽ được tạo và nó có thể được thực thi. Vì vậy, chỉ cần bỏ qua lỗi này lần đầu tiên và sau đó vì Db sẽ tồn tại nên nó sẽ không xảy ra nữa.


4

vui lòng xác minh rằng bạn có tài liệu tham khảo

<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.0" />

5
Tôi đang sử dụng <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />bao gồm tài liệu tham khảo đó. Tôi cũng đã thử bao gồm cả những điều trên, nhưng không có thay đổi.
ruhm

4

Bạn có thể thử giải pháp này từ cuộc thảo luận này , được lấy cảm hứng từ bài đăng này .

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();
}

2
Tôi vẫn nhận được: Thêm một triển khai của 'IDesignTimeDbContextFactory <DatabaseContext>' ......
Reft

4

Một điều thực sự đã giúp tôi là bài viết này: https://elanderson.net/2017/09/unable-to-create-an-object-of-type-applicationdbcontext-add-an-implementation-of-idesigntimedbcontextfactory/

Ý tưởng cơ bản là trong sự thay đổi từ .net core 1 sang 2, tất cả khởi tạo db nên được chuyển ra khỏi StartUp.cs và vào Program.cs. Nếu không, các tác vụ EF sẽ thử và chạy các hàm DB của bạn khi thực hiện các tác vụ.

"Có một phần hay trong tài liệu di chuyển chính thức ( https://docs.microsoft.com/en-us/ef/core/mispose/1x-2x-upgrade ) có tiêu đề" Di chuyển mã khởi tạo cơ sở dữ liệu "mà tôi dường như có đã bỏ lỡ. Vì vậy, trước khi bạn đi xuống bất kỳ lỗ thỏ nào như tôi đã làm, hãy đảm bảo rằng đây không phải là nguyên nhân khiến bạn cần phải thêm triển khai IdesignTimeDbContextFactory. "


Cảm ơn, điều này đã giúp tôi quá.
Sergey

3

Từ

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

Khi bạn tạo một ứng dụng ASP.NET Core 2.0 mới, móc nối này được bao gồm theo mặc định. Trong các phiên bản trước của EF Core và ASP.NET Core, các công cụ cố gắng gọi trực tiếp Startup.ConfigureServices để lấy nhà cung cấp dịch vụ của ứng dụng, nhưng mẫu này không còn hoạt động chính xác trong các ứng dụng ASP.NET Core 2.0. Nếu bạn đang nâng cấp ứng dụng ASP.NET Core 1.x lên 2.0, bạn có thể sửa đổi lớp Chương trình của mình để tuân theo mẫu mới.

Thêm Nhà máy trong .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);
        }
    }

3

Tôi gặp sự cố này và điều này đã được giải quyết Bằng cách Đặt -> Dự án Ứng dụng Web (Bao gồm Chương trình.cs) thành -> "Đặt làm Dự án Khởi động"

Sau đó chạy -> add -igration initial -verbose

trong Bảng điều khiển Trình quản lý Gói

Đặt làm Dự án Khởi động


Cảm ơn bạn, giải pháp duy nhất phù hợp với tôi là đặt dự án web thành dự án khởi động và đó chính xác là những gì cần phải làm.
user3012760

3

Nếu bạn muốn tránh những thứ IDesignTimeDbContextFactory đó: Chỉ cần đảm bảo rằng bạn không sử dụng bất kỳ phương thức Seed nào trong phần khởi động của mình. Tôi đang sử dụng phương thức hạt giống tĩnh trong khởi động của mình và nó gây ra lỗi này cho tôi.


2

Trước đây, bạn đã định cấu hình dữ liệu hạt giống trong phương pháp Định cấu hình trong Startup.cs. Bây giờ bạn nên sử dụng phương pháp Định cấu hình chỉ để thiết lập đường dẫn yêu cầu. Mã khởi động ứng dụng thuộc phương thức Chính.

Phương thức chính được tái cấu trúc. Thêm các tham chiếu sau vào Program.cs:

sử dụng Microsoft.Extensions.DependencyInjection;

sử dụng 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();
}



2

Trong trường hợp của tôi, tôi gặp sự cố vì tôi có một phương thức có tên SeedData.EnsurePopulated () được gọi trên tệp Startup.cs của tôi .

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);
    }
}

Công việc của lớp SeedData là thêm dữ liệu ban đầu vào bảng cơ sở dữ liệu. Mã của nó là:

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();
        }
    }

GIẢI PHÁP

Trước khi thực hiện di chuyển, chỉ cần nhận xét về việc gọi lớp SeedData trong tệp Startup.cs.

// SeedData.EnsurePopulated(app);

Điều đó đã giải quyết được vấn đề của tôi và hy vọng vấn đề của bạn cũng được giải quyết theo cách tương tự.


1

Tôi đã gặp phải vấn đề tương tự. Tôi có hai dự án trong giải pháp. cái nào

  1. API
  2. Dịch vụ và repo, chứa các mô hình ngữ cảnh

Ban đầu, dự án API được đặt là dự án Khởi động.

Tôi đã thay đổi dự án Khởi động thành dự án chứa các lớp ngữ cảnh. nếu bạn đang sử dụng Visual Studio, bạn có thể đặt một dự án làm dự án Khởi động bằng cách:

mở giải pháp khám phá >> nhấp chuột phải vào dự án ngữ cảnh >> chọn Đặt làm dự án khởi động


1

Trước hết, hãy đảm bảo rằng bạn đã định cấu hình cơ sở dữ liệu của mình trong Startup.cs trường hợp của tôi, tôi gặp lỗi này vì tôi không chỉ định thông tin bên dưới trongStartup.cs

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

1

Sử dụng ASP.NET Core 3.1 và EntityFrameWorkCore 3.1.0. Ghi đè cấu hình OnCon của lớp ngữ cảnh chỉ bằng một hàm tạo không tham số

```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);
        }
    }
```

1

Tôi đang đối mặt với lỗi

"Không thể tạo đối tượng thuộc loại 'MyContext'. Thêm triển khai 'IDesignTimeDbContextFactory' vào dự án hoặc xem https://go.microsoft.com/fwlink/?linkid=851728 để biết thêm các mẫu được hỗ trợ tại thời điểm thiết kế."

Đây là cách vấn đề của tôi đã được giải quyết. Chạy lệnh dưới đây khi bạn đang ở trong thư mục giải pháp của mình

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

Đây Ứng dụng là dự án khởi động của tôi có chứa lớp Startup.cs & Cơ sở hạ tầng là dự án của tôi có chứa lớp DbContext.

sau đó chạy cập nhật bằng cách sử dụng cùng một cấu trúc.

dotnet ef database update --project "Blog.Infrastructure" --startup-project "Blog.Application"

0

Tôi gặp vấn đề tương tự vì tôi đang tham khảo cũ- Microsoft.EntityFrameworkCore.Tools.DotNet

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

Sau khi nâng cấp lên phiên bản mới hơn, nó đã được giải quyết


0

Trong tệp appsettings.json của dự án chính, tôi đã đặt 'Thư mục Sao chép vào Đầu ra' thành "Sao chép luôn" và nó đã hoạt động.


0

Lớp ngữ cảnh DB mẫu cho các ứng dụng bảng điều khiển lõi .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);
        }
    }
}

Mặc dù điều này có thể trả lời câu hỏi của các tác giả, nhưng nó thiếu một số từ giải thích và liên kết đến tài liệu. Các đoạn mã thô không hữu ích lắm nếu không có một số cụm từ xung quanh nó. Bạn cũng có thể thấy cách viết một câu trả lời hay rất hữu ích. Vui lòng chỉnh sửa câu trả lời của bạn.
hellow

0

Bạn cũng có thể sử dụng phương thức khởi tạo lớp khởi động để thêm tệp json (nơi chứa chuỗi kết nối) vào cấu hình. Thí dụ:

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

        _config = builder.Build();
    }

0

Đối với tôi, đó là vì tôi đã thay đổi Output Typedự án khởi nghiệp của mình từ Console Applicationsang Class Library.

Hoàn nguyên để Console Applicationthực hiện thủ thuật.


0

Tôi đã gặp sự cố này trong một giải pháp có:

  • một dự án .NET Core 2.2 MVC
  • một dự án .NET Core 3.0 Blazor
  • Ngữ cảnh DB trong dự án thư viện lớp .NET Standard 2.0

Tôi nhận được thông báo "không thể tạo đối tượng ..." khi dự án Blazor được đặt làm dự án khởi động, nhưng không phải nếu dự án MVC được đặt làm dự án khởi động.

Điều đó làm tôi khó hiểu, bởi vì trong Bảng điều khiển Trình quản lý Gói (là nơi tôi đang tạo quá trình di chuyển), tôi đặt dự án Mặc định thành thư viện lớp C # thực sự chứa Ngữ cảnh DB và tôi cũng chỉ định ngữ cảnh DB trong lời kêu gọi của tôi để bổ sung di chuyển add-migration MigrationName -context ContextName , vì vậy có vẻ lạ khi Visual Studio quan tâm dự án khởi động nào hiện đang được thiết lập.

Tôi đoán lý do là khi dự án Blazor là dự án khởi động, PMC đang xác định phiên bản .NET là Core 3.0 từ dự án khởi động và sau đó cố gắng sử dụng phiên bản đó để chạy di chuyển trên lớp .NET Standard 2.0 thư viện và đánh vào một cuộc xung đột nào đó.

Bất kể nguyên nhân là gì, việc thay đổi dự án khởi động thành dự án MVC nhắm mục tiêu Core 2.2, thay vì dự án Blazor, đã khắc phục sự cố


0

Đối với tôi, vấn đề là tôi đã chạy các lệnh di chuyển bên trong dự án sai. Việc chạy các lệnh bên trong dự án chứa Startup.cs thay vì dự án chứa DbContext cho phép tôi vượt qua vấn đề cụ thể này.


0

Trong trường hợp của tôi, thiết lập dự án StartUp trong init sẽ hữu ích. Bạn có thể làm điều này bằng cách thực thi

dotnet ef migrations add init -s ../StartUpProjectName

-4

Tôi đã có cùng một vấn đề. Chỉ cần thay đổi ap.jason thành application.jason và nó đã khắc phục sự cố

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.