[英]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
属性Products
与AdventureWorks
数据库架构或表名称不匹配。 让我们看一下打击截图:
正如您在数据库架构表名称中看到的那样,构造遵循格式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.