System.InvalidOperationException: «Не найдено подходящего конструктора для типа сущности HealthCheck» - PullRequest
2 голосов
/ 24 апреля 2019

Я получаю эту ошибку при попытке добавить что-то в мою базу данных через EF Core.

System.InvalidOperationException: 'Не найдено подходящего конструктора для типа сущности' HealthCheck '.Следующие конструкторы имели параметры, которые нельзя привязать к свойствам типа сущности: невозможно связать 'hctype' в 'HealthCheck (заголовок строки, строковый hctype, строковая ссылка)'. '

Это мойКласс HealthCheck:

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

namespace Application.Models
{
    public class HealthCheck
    {
        public HealthCheck(string title, string hctype, string link)
        {
            Title = title;
            HCType = hctype;
            Link = link;
        }

        public int Id { get; set; }
        public string Title { get; set; }
        public string HCType { get; set; }
        public string Link { get; set; }
    }
}

Мой репозиторийContext

using Microsoft.EntityFrameworkCore;
using Application.Models;

namespace Application.Repository
{
    public class RepositoryContext : DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer(
                @"Server=(localdb)\mssqllocaldb;Database=healthcheck;Integrated Security=True");
        }

        //public DbSet<HealthCheck> HealthChecks { get; set; }
        //public DbSet<UserHealthCheck> UserHealthChecks { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<HealthCheck>().ToTable("HealthCheck");
            modelBuilder.Entity<UserHealthCheck>().ToTable("UserHealthCheck");
        }
    }
}

Мой репозиторий

using Application.Models;

namespace Application.Repository
{
    public class Repository
    {
        public void InsertHealthCheck(HealthCheck healthCheck)
        {
            using (var db = new RepositoryContext())
            {
                db.Add(healthCheck);
                db.SaveChanges();
            }
        }
    }
}

И вот откуда вызывается "InsertHealthCheck ()" из

[Route("/api/HealthCheck/Website")]
        [HttpPost]
        public ActionResult WebsiteStatus([FromBody] WebsiteDataModel websiteData)
        {
            HealthCheck data = new HealthCheck(websiteData.Title, "Website", websiteData.Url);
            try
            {
                HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(websiteData.Url);
                HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
                HttpStatusCode HealthCheckStatusCode = myHttpWebResponse.StatusCode;
                myHttpWebResponse.Close();
                return Ok(HealthCheckStatusCode);
            }
            catch(UriFormatException)
            {
                return Ok("Check url.");
            }
            catch (Exception)
            {
                return Ok("400");
            }
            finally
            {
                repository.InsertHealthCheck(data);
            }
        }

Если вы можете помочь мне, я был бы признателен, если бы вам нужно было опубликовать любую другую часть кода, просто спросите.

Кроме того, я буквально только начал изучать EF Core,так что, если я сделал что-то действительно глупое, укажите на это

Ответы [ 3 ]

0 голосов
/ 24 апреля 2019

Так как класс HealthCheck представляет таблицу в вашей базе данных, вам необходимо предоставить пустой конструктор.
Попробуйте следующую реализацию и дайте мне знать, если вы все еще получаете ту же ошибку:

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

namespace Application.Models
{
    public class HealthCheck
    {
        public HealthCheck()
        {
        }

        public HealthCheck(string title, string hctype, string link)
        {
            Title = title;
            HCType = hctype;
            Link = link;
        }

        public int Id { get; set; }
        public string Title { get; set; }
        public string HCType { get; set; }
        public string Link { get; set; }
    }
}
0 голосов
/ 13 июля 2019

Предоставление конструктора без параметров устраняет проблему, но это не было истинной причиной ошибки в случае OP. EF Core 2.1 и выше использует строгое соглашение для сопоставления параметров конструктора с именами свойств сущности. Ожидается, что имя параметра конструктора будет истинным представлением верблюжьего имени имени свойства в Pascal-case. Если вы измените имя параметра с «hctype» на «hCType», вы не должны получить ошибку, и не должен предоставить конструктор без параметров, если ваш подход к проектированию на основе домена требует, чтобы это было проблематично сделай так.

Если, однако, вы просто предоставили параметризованный конструктор для удобства, но для вызывающей стороны не является ошибкой возможность создания экземпляра HealthCheck с помощью оператора "new", тогда простое добавление конструктора без параметров приемлемо.

0 голосов
/ 24 апреля 2019

Вам не хватает пустого конструктора:

public class HealthCheck
{
   // here
   public HealthCheck()
   {
   }

   public HealthCheck(string title, string hctype, string link)
   {
       Title = title;
       HCType = hctype;
       Link = link;
   }

   public int Id { get; set; }
   public string Title { get; set; }
   public string HCType { get; set; }
   public string Link { get; set; }


}

попробуйте вот так

...