System.InvalidOperationException:'找不到适用于实体类型'HealthCheck'的合适的构造函数

时间:2019-04-24 20:37:10

标签: c# asp.net model-view-controller entity-framework-core

尝试通过EF Core在数据库中添加某些内容时出现此错误。

  

System.InvalidOperationException:'找不到适合的构造函数   实体类型“ HealthCheck”。以下构造函数具有参数   不能绑定到实体类型的属性:无法绑定   “'HealthCheck(字符串标题,字符串hctype,字符串链接)”中的“ 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; }
    }
}

我的RepositoryContext

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 :(得分:0)

您缺少空的构造函数:

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


}

那样尝试

答案 1 :(得分:0)

由于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; }
    }
}

答案 2 :(得分:0)

提供无参数的构造函数可以避免该问题,但这并不是在OP情况下导致错误的真正原因。 EF Core 2.1 and higher uses a strict convention to map constructor parameters to property names of the entity.它期望构造函数参数的名称以帕斯卡大小写形式表示属性名称的真实驼峰式表示形式。如果将参数名称从“ hctype”更改为“ hCType”,则在出现域驱动设计的方法表明这有问题时,应该不会出现错误,并且 not 不必提供无参数的构造函数为此。

但是,如果您只是为了方便起见而提供了参数化构造函数,但是调用者能够使用“ new”运算符实例化HealthCheck并非不正确,则可以简单地添加无参数构造函数。