Невозможно добавить DbContext ASP.Net Core или получить доступ к данным с помощью контроллеров. - PullRequest
0 голосов
/ 12 мая 2018

Я создал контекст, используя Scaffold-DbContext

Scaffold-DbContext "Server=******.database.windows.net;Database=first_choice_main; User ID = ****; Password=****" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models\Azure\Main

Он создал следующий контекст в папке Models \ Azure \ Main :

namespace firstChoicePortal.Models.Azure.Main
{
    public partial class First_choice_mainContext : DbContext
    {
        public virtual DbSet<BlobsDetails> BlobsDetails { get; set; }
        public virtual DbSet<BranchInfo> BranchInfo { get; set; }
        public virtual DbSet<BranchMatrix> BranchMatrix { get; set; }
        public virtual DbSet<CommEventLog> CommEventLog { get; set; }
        public virtual DbSet<CommEventTypes> CommEventTypes { get; set; }
        public virtual DbSet<ContainerEvents> ContainerEvents { get; set; }
        public virtual DbSet<ContainerEventTypes> ContainerEventTypes { get; set; }
        public virtual DbSet<Containers> Containers { get; set; }
        public virtual DbSet<ContainerScans> ContainerScans { get; set; }
        public virtual DbSet<Customers> Customers { get; set; }
        public virtual DbSet<Drivers> Drivers { get; set; }
        public virtual DbSet<ExcludedPoints> ExcludedPoints { get; set; }
        public virtual DbSet<FilesToFtp> FilesToFtp { get; set; }
        public virtual DbSet<FtpEventLog> FtpEventLog { get; set; }
        public virtual DbSet<IncomingTngReturnScans> IncomingTngReturnScans { get; set; }
        public virtual DbSet<ItemTypes> ItemTypes { get; set; }
        public virtual DbSet<LinehaulTracker> LinehaulTracker { get; set; }
        public virtual DbSet<MaintEventTypes> MaintEventTypes { get; set; }
        public virtual DbSet<NewgisticsScans> NewgisticsScans { get; set; }
        public virtual DbSet<OutgoingUpdateQueue> OutgoingUpdateQueue { get; set; }
        public virtual DbSet<PodDetail> PodDetail { get; set; }
        public virtual DbSet<PodUpdatesSentDetail> PodUpdatesSentDetail { get; set; }
        public virtual DbSet<PodUpdatesSentMaster> PodUpdatesSentMaster { get; set; }
        public virtual DbSet<PointMaintEvents> PointMaintEvents { get; set; }
        public virtual DbSet<ProgramSettings> ProgramSettings { get; set; }
        public virtual DbSet<ReceiveScanEventTypes> ReceiveScanEventTypes { get; set; }
        public virtual DbSet<ReceiveScanLog> ReceiveScanLog { get; set; }
        public virtual DbSet<ReceiveScans> ReceiveScans { get; set; }
        public virtual DbSet<RepAssignedStopMatrix> RepAssignedStopMatrix { get; set; }
        public virtual DbSet<RepInfo> RepInfo { get; set; }
        public virtual DbSet<ScanTypes> ScanTypes { get; set; }
        public virtual DbSet<StopAddressDetails> StopAddressDetails { get; set; }
        public virtual DbSet<StopEventLog> StopEventLog { get; set; }
        public virtual DbSet<StopEventTypes> StopEventTypes { get; set; }
        public virtual DbSet<SystemsConfiguration> SystemsConfiguration { get; set; }
        public virtual DbSet<Table> Table { get; set; }
        public virtual DbSet<TestData> TestData { get; set; }
        public virtual DbSet<TestLh> TestLh { get; set; }
        public virtual DbSet<TngRmaItems> TngRmaItems { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings.
                optionsBuilder.UseSqlServer(@"Server=*****.database.windows.net;Database=first_choice_main; User ID = *****; Password=*****");
            }
        }

Затем я создал контроллер, используя метод правой кнопки мыши и выбрав « API-контроллер с действиями, используя EF ».

Это первая его часть:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using firstChoicePortal.Models.Azure.Main;

namespace firstChoicePortal.Controllers
{
    [Produces("application/json")]
    [Route("api/RepInfoApi")]
    public class RepInfoApiController : Controller
    {
        private readonly First_choice_mainContext _context;

        public RepInfoApiController(First_choice_mainContext context)
        {
            _context = context;
        }

        // GET: api/RepInfoApi
        [HttpGet]
        public IEnumerable<RepInfo> GetRepInfo()
        {
            return _context.RepInfo;
        }

Если я запускаю это и перехожу к https://localhost:44325/api/RepInfoApi, я получаю:

InvalidOperationException: невозможно разрешить службу для типа 'firstChoicePortal.Models.Azure.Main.First_choice_mainContext' при попытке активировать firstChoicePortal.Controllers.RepInfoApiController '.

Поэтому я подумал, что, возможно, мне нужно добавить это к моим службам при запуске, я добавил:

services.AddDbContext < First_choice_mainContext> (options =>
options.UseSqlServer(Configuration.GetConnectionString("AuzureConnectionMain")));

Но теперь я получаю ошибку времени выполнения при запуске:

"System.ArgumentException: 'AddDbContext был вызван с конфигурацией, но тип контекста' First_choice_mainContext 'только объявляет конструктор без параметров. Это означает, что конфигурация, переданная в AddDbContext, никогда не будет использоваться. Если конфигурация передается в AddDbContext, тогда' First_choice_mainContext 'должен объявить конструктор, который принимает DbContextOptions<First_choice_mainContext> и должен передать его базовому конструктору для DbContext.' "

Я поступаю неправильно?

ОБНОВЛЕНИЕ И ОБЪЯСНЕНИЕ О РЕШЕНИИ

У меня была пара вещей, отсутствующих / неправильных, и, как указал Нкоси, сообщение об ошибке содержало решение. Но это немного глубже, чем это. Я пытался использовать строку подключения, извлеченную из файла appsettings.json. Инструмент работает на все 100%, но он жестко кодирует информацию о вашем соединении непосредственно в текстовом тексте с этим битом кода:

 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings.
                optionsBuilder.UseSqlServer(@"Server=******.database.windows.net;Database=first_choice_main; User ID = ******; Password=******");
            }
        }

Как видите, MS рекомендует удалить этот код и заменить его решением на основе строки подключения - что я почти правильно сделал. Почти не совсем урезал - спасибо сообществу SO еще раз!

1 Ответ

0 голосов
/ 13 мая 2018

Сообщение об исключении объясняет, что именно нужно сделать

'AddDbContext был вызван с конфигурацией, но тип контекста' First_choice_mainContext 'объявляет только конструктор без параметров. Это означает, что конфигурация, переданная в AddDbContext, никогда не будет использоваться. Если конфигурация передается в AddDbContext, тогда First_choice_mainContext должен объявить конструктор, который принимает DbContextOptions<First_choice_mainContext> и должен передать его базовому конструктору для DbContext .

Акцент на шахте

Следуйте инструкциям и добавьте конструктор

public partial class First_choice_mainContext : DbContext {


    public First_choice_mainContext(DbContextOptions<First_choice_mainContext> options) 
        : base(options) {
    }

    //...
}

Таким образом, контекст может быть корректно разрешен при внедрении в зависимые классы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...