[英]Entity Framework 6 - SqlException: Invalid object name 'dbo.Course'
[英]Entity Framework SqlException: Invalid object name
我已将旧应用程序从 EF6 DB First 迁移到从现有数据库手动生成的上下文,并始终在 ASP.NET 4.7 上使用 EF6。
上下文定义如下:
namespace DataModel
{
using System;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
public partial class MyEntities : DbContext
{
public MyEntities()
: base("name=MyEntities")
{
}
public virtual DbSet<Country> Countries { get; set; }
public virtual DbSet<SomeNameSpace.Report> RE_Reports { get; set; }
}
}
class 实体报告定义如下:
namespace DataModel
{
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity.Spatial;
namespace SomeNameSpace
{
public partial class Report
{
[Key]
public int ReportID { get; set; }
[StringLength(1024)]
public string Title { get; set; }
}
}
}
在编译时一切正常,应用程序成功构建。 一旦我在第一次访问报告实体时运行它,我会收到以下错误:
无效的 object 名称“dbo.Reports”
因此,Entity Framework 在 SQL 中将查询表名转换为Reports
,即实体名称的复数形式,而不是转换为RE_Reports
,后者是数据库表的实际名称。
为什么?
请注意,使用其他实体(例如 Country)的查询在运行时也能正常工作。
唯一的区别是我添加到报告表中的额外命名空间。
不知道为什么您的代码不起作用(根据我读过的内容,或者当前的 ef 核心约定与 EF6 不同),但作为一种解决方法,您可以使用TableAttibute
标记实体,如下所示:
[Table("RE_Reports")]
public partial class Report
因此,Entity Framework 在 SQL 中将查询表名转换为 Reports,即实体名称的复数形式,而不是转换为 RE_Reports,即数据库表的实际名称。
为什么?
因为它是实体框架中的Convention
。
实体框架有三个选项可以将您的实体名称转换为表名称:
在OnModelCreating
中使用流利的方法:
modelBuilder.Entity<Report>().ToTable("RE_Reports");
在实体 class 上使用属性(如Guru Stron回答中所述):
[Table("RE_Reports")]
使用Convention
:
如果开发人员未应用选项 1 和 2,则默认情况下,EF 会将表名推断为实体名称的复数形式(您的情况)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.