未找到实体类型。确保实体类型已添加到模型中

Cur*_*uga 7 .net c# asp.net-mvc entity-framework-core asp.net-core

我是 ASP.NET Core 的新手,我正在尝试将实体插入到从简单的现有 MariaDB 数据库搭建的 Entity Framework Core 模型中。

这是实体模型:

    public class ScrapeAsincroni
    {
        public int Id { get; set; }
        public string Paese { get; set; }
        public string Engine { get; set; }
        public string Keywords { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

这是应该添加实体的控制器操作:

    public JsonResult create(string paese, string engine, string keywords)
        {
            ScrapeAsincroni scrapeAsincrono = new ScrapeAsincroni {
                Paese = paese,
                Engine = engine,
                Keywords = keywords
            };
            _context.Add(scrapeAsincrono);

            try
            {
                _context.SaveChangesAsync();
            }
            catch (Exception ex)
            {
                return Json(new Dictionary<string, int?> { { "id", null } });
            }
            return Json(new Dictionary<string, int?>{ {"id", scrapeAsincrono.Id} });
        }
Run Code Online (Sandbox Code Playgroud)

数据库上下文 (_context) 已在控制器的构造函数上初始化。线

 _context.Add(scrapeAsincrono);
Run Code Online (Sandbox Code Playgroud)

抛出以下异常:

System.InvalidOperationException:找不到实体类型“ScrapeAsincroni”。确保实体类型已添加到模型中。

这是与该模型相关的 modelBuilder 代码

   public partial class ScraperDbContext : DbContext
    {
        public ScraperDbContext()
        {
        }

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

        public virtual DbSet<ScrapeAsincroni> ScrapeAsincroni { 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.UseMySql("server=#.#.#.#;port=####;user=####;password=####;database=####", x => x.ServerVersion("10.3.25-mariadb"));
            }
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<ScrapeAsincroni>(entity =>
            {
                entity.HasComment("Informazioni su una ricerca asincrona dello Scraper");

                entity.Property(e => e.Id)
                    .HasColumnName("id")
                    .HasColumnType("int(11)");

                entity.Property(e => e.Engine)
                    .HasColumnName("engine")
                    .HasColumnType("varchar(255)")
                    .HasCharSet("utf8")
                    .HasCollation("utf8_general_ci");

                entity.Property(e => e.Keywords)
                    .IsRequired()
                    .HasColumnName("keywords")
                    .HasColumnType("text")
                    .HasCharSet("utf8")
                    .HasCollation("utf8_general_ci");

                entity.Property(e => e.Paese)
                    .HasColumnName("paese")
                    .HasColumnType("varchar(255)")
                    .HasCharSet("utf8")
                    .HasCollation("utf8_general_ci");
            });

            OnModelCreatingPartial(modelBuilder);
        }

        partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
    }         
Run Code Online (Sandbox Code Playgroud)

我似乎无法理解为什么会发生这种情况,并且在网上找不到任何解决方案。

Cur*_*uga 5

当然,这是一个微不足道的错误,我会在第二天修复。我使用的是 DbContext 基类,而我应该使用我在搭建数据库时定义的自定义数据库上下文类。这是之前在控制器脚本中实例化上下文的方式:

        private readonly DbContext _context;
        public ScrapeAsincroniController(DbContext context)
        {
            _context = context;
        }
Run Code Online (Sandbox Code Playgroud)

现在它是:

        private readonly ScraperDbContext _context;
        public ScrapeAsincroniController(ScraperDbContext context)
        {
            _context = context;
        }
Run Code Online (Sandbox Code Playgroud)

我还在startup.cs中更改了这一行:

 services.AddDbContext<ScraperDbContext>(options => options
                .UseMySql("<your_connection_string>",
                mysqlOptions => mysqlOptions.ServerVersion(new Pomelo.EntityFrameworkCore.MySql.Storage.ServerVersion(new Version(10, 3, 25), ServerType.MariaDb))
                )
            );
Run Code Online (Sandbox Code Playgroud)


Rav*_*rya 4

添加

public DbSet<ScrapeAsincroni> ScrapeAsincronis { get; set; }
Run Code Online (Sandbox Code Playgroud)

在您的上下文文件中,用于将实体添加到模型中。