繁体   English   中英

SqlException:无效的 object 名称“产品”

[英]SqlException: Invalid object name 'Products'

我正在尝试创建一个数据库优先的方法 ASP.NET Core 6 MVC web 应用程序。

为此,我决定使用 Microsoft 的AdventureWorks示例数据库。

简而言之,我试图从名为Production.Product的表中获取一些信息。

这是代码:

Product Class:

 public class Product
 {
    public int ProductID { get; set; }
    public string Name { get; set; }
    public string ProductNumber { get; set; }
    // More properties.
 }

语境:

public class AppDbContext : DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options)
        : base(options)
    {
    }

    public virtual DbSet<Product> Products { get; set; }
}

我像每个开发人员一样在Program class 中添加了AppDbContext ,没什么特别的。

出于测试目的,我使用HomeController来获取数据。

public class HomeController : Controller
{
    private readonly AppDbContext _context;

    public HomeController(AppDbContext context)
    {
        _context = context;
    }

    // I have the view created.
    public IActionResult GetProducts()
    {
        var model = _context.Products.ToList();
        return View(model);
    }
}

当我 go 到GetProducts视图时,我遇到了这个错误:

处理请求时发生未处理的异常。

SqlException:无效的 object 名称“产品”。 Microsoft.Data.SqlClient.SqlConnection.OnError(SqlException 异常,bool breakConnection,Action wrapCloseInAction)

我仔细检查了连接字符串。 尝试将Product class 重命名为Production_Product

简而言之,我试图从名为 Production.Product 的表中获取一些信息。当我 go 到 GetProducts 视图时,我遇到了这个错误:“SqlException:无效的 object 名称'Products'”。 我仔细检查了连接字符串。 尝试将产品 class 重命名为 Production_Product。

嗯,根据你的描述,我已经成功重现了你的问题。 正如您在下面看到的:

在此处输入图像描述

为什么错误:

通常,异常告诉我们, AppDbContext属性ProductsAdventureWorks数据库架构或表名称不匹配。 让我们看一下打击截图:

在此处输入图像描述

正如您在数据库架构表名称中看到的那样,构造遵循格式Production.Product 因此,当您的实体执行查询时,它通过DbSet<Product> Products进行搜索,但Product显然不存在或不匹配,结果我们以错误结束。

如何解决:

我们可以通过以下几种方法解决错误。 在这里我完全同意@marc_s 因此,我正在添加完整的实现。

方式:1 使用Entity framework Data Annotation:

如果您更喜欢使用实体框架的数据注释,那么您必须按以下方式修改您的Product class:

    [Table("Production.Product")]
    public class Product
    {
       
        public int ProductID { get; set; }
        public string Name { get; set; }
        public string ProductNumber { get; set; }
    }

注意:要点是,数据库架构名称应与您的 model 或 class 相同。您可以在此处的官方文档中获取更多详细信息。

方式:2 使用 Fluent API 验证:

在这种情况下,您应该像打击一样修改您的代码:

protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Product>().ToTable("Production.Product");
           

        }

完整的 DbContext:

public class AppDbContext : DbContext
    {
        public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
        {
        }
       
        public DbSet<Product> Products { get; set; }
     

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Product>().ToTable("Production.Product");
           

        }
    }

注意:如前所述,数据库表名必须与AppDbContext实体名相同。 您可以在此处获取更多详细信息。

方式: 3 重命名数据库模式表名:

我们甚至可以将我们的数据库表名从Production.Product重命名为Product或者我们可以创建名为Product的新表。 无论哪种方式都可以解决问题。 看看下面:

在此处输入图像描述

这也将相应地解决您的问题。

Output:

在此处输入图像描述

注意:要点是,您的数据库表名应与 AppDbContext 中定义的实体AppDbContext匹配。 最重要的是,您可以按照上面描述的任何一种方式解决问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM