实体框架异常:无效的对象名称

时间:2012-07-20 14:13:58

标签: c# .net entity-framework

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

例外

  

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

内部异常

  

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

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

连接字符串:

  

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

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

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

enter image description here

更新

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

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

原始代码

    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<Dinner> Dinners { get; set; }
    public DbSet<RSVP> RSVPs { get; set; }
}
}

参考

  1. http://nerddinner.codeplex.com/discussions/358197
  2. Entity framework - Invalid Object Name
  3. Invalid object name 'dbo.TableName' when retrieving data from generated table
  4. http://blogs.msdn.com/b/adonet/archive/2011/09/28/ef-4-2-code-first-walkthrough.aspx

6 个答案:

答案 0 :(得分:28)

  

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

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

你能做什么:

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

答案 1 :(得分:4)

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

你需要的是:

public class NerdDinnersInitializer : DropCreateDatabaseIfModelChanges<NerdDinners> { }

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

Database.SetInitializer(new NerdDinnersInitializer());

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

答案 2 :(得分:2)

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

当我运行我的应用时,没有创建任何表格。我发现了这篇关于创建Code First Database Initializer Strategy的非常简单的文章,它首先检查数据库是否存在,然后针对数据库运行脚本来创建表。

正如文章中所述 - 请注意,在部署此类策略时,无论何时应用程序重新启动,都将重新创建所有数据库表!此策略应该只运行一次。

但你已经知道了。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

据我所知,您希望代码能够根据您的实体描述自动创建数据库。但除非您明确创建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/

答案 5 :(得分:0)

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

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

相关问题