entity frameworkexception:无效的对象名称

我正在尝试使用Code First方法创建数据库。 当我运行以下代码时,我收到以下exception。 我定义的字段有什么问题吗? 我们怎样才能克服这一点?

例外

更新条目时发生错误。 有关详细信息,请参阅内部exception

内在例外

“无效的对象名称’dbo.Dinners’。

注意 :我在数据库中没有这样的表(Dinners)。 该代码应该创建表。 我只是提供连接字符串来识别EF Code First中提到的服务器:无法连接到SQL Server 。 我应该更改连接字符串吗?

连接字符串:

string connectionstring =“Data Source = .; Initial Catalog = LibraryReservationSystem; Integrated Security = True; Connect Timeout = 30”;

LibraryReservationSystem数据库已经是现有数据库。 它没有桌子。 我期待EF创建表格。

我从一个正在运行的LINQ 2 SQL应用程序复制的连接字符串。 我是否需要对其进行任何更改才能提供给EF?

在此处输入图像描述

UPDATE

当我包含以下代码时,exception发生了变化。 现在它说 – “无效的对象名称’dbo.Dinner’。”。 它现在抱怨餐桌; 不是晚餐表。

protected override void OnModelCreating(DbModelBuilder modelbuilder) { modelbuilder.Conventions.Remove(); } 

原始代码

  static void Main(string[] args) { string connectionstring = "Data Source=.;Initial Catalog=LibraryReservationSystem;Integrated Security=True;Connect Timeout=30"; using (var db = new NerdDinners(connectionstring)) { var product = new Dinner { DinnerID = 1, Title = 101 }; db.Dinners.Add(product); int recordsAffected = db.SaveChanges(); } } using System.Data.Entity; namespace LijosEF { public class Dinner { public int DinnerID { get; set; } public int Title { get; set; } } public class RSVP { public int RSVPID { get; set; } public int DinnerID { get; set; } public virtual Dinner Dinner { get; set; } } //System.Data.Entity.DbContext is from EntityFramework.dll public class NerdDinners : System.Data.Entity.DbContext { public NerdDinners(string connString): base(connString) { } public DbSet Dinners { get; set; } public DbSet RSVPs { get; set; } } } 

参考

  1. http://nerddinner.codeplex.com/discussions/358197
  2. entity framework – 无效的对象名称
  3. 从生成的表中检索数据时,对象名称“dbo.TableName”无效
  4. http://blogs.msdn.com/b/adonet/archive/2011/09/28/ef-4-2-code-first-walkthrough.aspx

LibraryReservationSystem数据库已经是现有数据库。 它没有桌子。 我期待EF创建表格。

那不对。 如果数据库存在,则EF不会在此数据库中创建任何表。 如果数据库不存在,EF可以创建数据库。 这是默认的数据库初始化程序CreateDatabaseIfNotExists ,如果您没有显式更改它,它将被应用。 您可以选择另外两个初始值设定项: DropCreateDatabaseAlwaysDropCreateDatabaseIfModelChanges 。 但这些都不会只在现有数据库中创建表,而是完全删除数据库并从头创建包括所有表的数据库。

你能做什么:

  • 手动删除数据库(例如在SSMS中),然后EF将创建一个包含表的新数据库
  • 或者使用DropCreateDatabaseAlways初始化程序一次让EF创建包含表的数据库,然后再次删除初始化程序
  • 或者,如果由于某种原因无法删除数据库,请在Seed方法中编写SQL代码,将表格添加到数据库中 (错误,感谢Mark Stafford的评论)
  • 或者,在添加新实体时,使用代码优先迁移 (EF> = 4.3)将新表添加到现有数据库。

@Slauma的答案是正确的 – 表是在初始化时创建的。 删除数据库并让EF创建它可能是最简单的(如果你保持连接字符串不变,它将在本地机器上创建一个名为LibraryReservationSystem的数据库;如果你要使用它,你应该指定一个显式的主机名此时配置中的连接字符串)。

你需要的东西是:

 public class NerdDinnersInitializer : DropCreateDatabaseIfModelChanges { } 

您还需要在Main方法中设置初始值设定项:

 Database.SetInitializer(new NerdDinnersInitializer()); 

明智的话:永远不要使用上面的初始化程序部署应用程序。 您可以在此博客文章中看到如何通过配置文件控制初始化程序,以获取有关如何在生产应用程序中控制此操作的更多详细信息。

我刚刚遇到了同样的问题 – 我已经在我们网络中需要SQL身份validation的开发SQL框中创建了我的数据库。

当我运行我的应用程序时,没有创建表。 我发现了这篇关于创建Code First数据库初始化策略的非常简单的文章,该策略首先检查数据库是否存在,然后针对数据库运行脚本来创建表。

正如文章中所述 – 注意当部署这样的策略时,无论何时应用程序重新开始,都将重新创建所有数据库表! 这个策略应该只运行一次。

但你已经知道了。

如错误所示,您的数据库中没有名为Dinners的表。

您使用单个或多个表名吗? 即晚餐或晚餐?

据我所知,您期望代码根据您的实体描述自动创建数据库。 但除非您明确创建DB,否则不会发生这种情况。 请查看以下链接http://www.simple-talk.com/dotnet/.net-framework/entity-framework-4460—learn-to-create-databases-from-the-model/和本教程EF codefirst: http ://codefirst.codeplex.com/

设置实体后,可以右键单击EDMX文件的工作区,然后选择“从模型生成数据库…”。 单击直到您的窗口中有脚本。 对于该脚本,您将不得不删除数据库创建步骤(如果存在)并直接进入CREATE TABLE …

复制 – 粘贴并执行您拥有的任何数据库。 您可能必须调整特定RDBMS的脚本。