Ошибка миграции ядра Asp.net и Entityframwork - PullRequest
0 голосов
/ 26 июня 2019

У меня есть папка моделей, а в папке - Todo.cs и TodoContext.cs

В Todo.cs мой код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace ApiCrudWithEfCore.Models
{
    public class Todo
    {
        public int Id { get; set; }
        public string title { get; set; }
        public bool Iscomplete { get; set; }

    }
}

А в TodoContext у меня есть:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using System.ComponentModel.DataAnnotations;

namespace ApiCrudWithEfCore.Models
{
    public class TodoContext : DbContext
    {
        public TodoContext(DbContextOptions<TodoContext> options) :base(options) {}

        public DbSet<Todo> Todos { get; set; }

    }
}

После этого я поместил строку подключения в appsettings.json :

{ соединение: "Сервер = (localdb) \ mssqllocaldb; База данных = Todo; Trusted_Connection = True;", "Логирование": { "LogLevel": { «По умолчанию»: «Предупреждение» } }, "AllowedHosts": "*" }

И я использую его в startup.cs вот так:

 public void ConfigureServices(IServiceCollection services,IConfiguration config)
        {

            services.AddMvc();

            services.AddDbContext<TodoContext>(options => options.UseSqlServer(config.GetConnectionString("connection")));
        }

Но когда я использую команду Add-Migration, она выдаёт мне эту ошибку:

Произошла ошибка при доступе к IWebHost в классе «Программа». Продолжая без поставщика услуг приложения. Ошибка: Метод ConfigureServices должен быть либо без параметров, либо принимать только один параметр типа IServiceCollection. Невозможно создать объект введите «TodoContext». Для разных шаблонов, поддерживаемых при дизайне время см https://go.microsoft.com/fwlink/?linkid=851728

Я прочитал это, но не смогу найти мне что-нибудь полезное?

Ответы [ 4 ]

2 голосов
/ 26 июня 2019

Вы также можете попробовать зарегистрировать контекст БД:

public IConfiguration Configuration { get; }

public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<TodoContext>(options => options.UseSqlServer(Configuration.GetConnectionString("connection")));
    ...
}

или вы можете вручную зарегистрировать контекст БД:

services.AddTransient<TodoContext>();
1 голос
/ 26 июня 2019

Пожалуйста, измените вашу конфигурацию на:

"ConnectionStrings": {
    "connection": "Server=Yourserver;Database=DAWIDARI;Trusted_Connection=true;"
},

и позвоните в Startup.cs

 services.AddDbContext<TodoContext>(options => options.UseSqlServer(config.GetConnectionString("connection")));
1 голос
/ 26 июня 2019

При использовании GetConnectionString ваш appsettings.json должен содержать раздел с именем ConnectionStrings , внутри которого вам нужно будет иметь в качестве ключа имя вашего соединения (например, "todo") и значение фактическая строка подключения.

Пример:

"ConnectionStrings": {
    "todo": "Server=(localdb)\mssqllocaldb;Database=Todo;Trusted_Connection=True;"
},
-- Rest of your appsettings

Тогда вы будете использовать это так: config.GetConnectionString("todo")

Цитируя из this , GetConnectionString представляет собой:

Сокращение для GetSection ("ConnectionStrings") [имя].

0 голосов
/ 26 июня 2019

Сначала я обнаружил свою проблему, изменил файл appsettings.json, как это было предложено, и выглядел он так:

{
  "ConnectionStrings": { "todo": "Server=(localdb)\\mssqllocaldb;Database=Todo;Trusted_Connection=True;" },
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
}

Но проблема не устранилась, поэтому я начал проверять startup.cs иизмените способ, которым я внедряю appsettings, чтобы мой файл startup.cs выглядел следующим образом:

        public IConfiguration _config { get; set; }
    public Startup(IConfiguration configuration) {
        _config = configuration;
    }

    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public void ConfigureServices(IServiceCollection services)
    {

        services.AddMvc();

        services.AddDbContext<TodoContext>(options => options.UseSqlServer(_config.GetSection("ConnectionStrings")["todo"]));
    }

Я внедряю Iconfiguration в конструкторе запуска и определяю _config var и назначаю ему конфигурацию, после чего я использую GetSection чтобы получить строку подключения

...