27

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

例外

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

内部异常

“无效的对象名称'dbo.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 吗?

在此处输入图像描述

更新

当我包含以下代码时,异常发生了变化。现在它说 - “无效的对象名称'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. 实体框架 - 无效的对象名称
  3. 从生成的表中检索数据时对象名称“dbo.TableName”无效
  4. http://blogs.msdn.com/b/adonet/archive/2011/09/28/ef-4-2-code-first-walkthrough.aspx
4

6 回答 6

29

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

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

你能做什么:

  • 手动删除数据库(例如在 SSMS 中),然后 EF 将创建一个包含表的新数据库
  • 或者使用DropCreateDatabaseAlways初始化器一次让 EF 创建包括表的数据库,然后再次删除初始化器
  • 或者,如果您出于某种原因无法删除数据库,请在Seed将表添加到数据库的方法中编写 SQL 代码(错误,感谢 Mark Stafford 的评论)
  • 或者,当您添加新实体时,使用Code-First Migrations (EF >= 4.3) 将新表添加到现有数据库。
于 2012-07-23T15:46:28.933 回答
5

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

你需要一些类似的东西:

public class NerdDinnersInitializer : DropCreateDatabaseIfModelChanges<NerdDinners> { }

您还需要在 Main 方法中设置初始化程序:

Database.SetInitializer(new NerdDinnersInitializer());

明智的说法:永远不要使用上面提到的初始化程序部署应用程序。您可以查看这篇关于如何通过配置文件控制初始化程序的博客文章,了解有关如何在生产应用程序中控制初始化程序的更多详细信息。

于 2012-07-23T15:58:21.840 回答
2

我刚刚遇到了完全相同的问题——我已经在需要 SQL 身份验证的网络内的开发 SQL 框上创建了我的数据库。

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

如文章所述 - 请注意,当部署这样的策略时,每当应用程序重新启动时,所有数据库表都会重新创建!这个策略应该只运行一次。

但你已经知道了。

于 2012-11-14T10:00:36.273 回答
0

正如错误所暗示的,您的数据库中没有调用表Dinners

您使用的是单表名还是复数表名?即晚餐或晚餐?

于 2012-07-20T14:15:41.710 回答
0

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

于 2012-07-23T15:14:02.597 回答
0

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

复制粘贴并在您拥有的任何数据库中执行。您可能需要针对特定​​的 RDBMS 调整脚本。

于 2012-07-23T20:21:19.517 回答