我正在尝试使用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?
更新
当我包含以下代码时,异常发生了变化。现在它说 - “无效的对象名称'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; }
}
}
参考
答案 0 :(得分:28)
LibraryReservationSystem数据库已经是现有数据库。它 没有桌子。我期待EF创建表格。
这不正确。如果数据库存在,则EF不会在此数据库中创建任何表。如果数据库不存在,EF可以创建数据库。这是默认的数据库初始化程序CreateDatabaseIfNotExists
,如果您没有明确更改它,它将被应用。您可以选择其他两个初始值设定项:DropCreateDatabaseAlways
或DropCreateDatabaseIfModelChanges
。但是这些都不会只在现有数据库中创建表,而是完全删除数据库并从头创建它,包括所有表。
你能做什么:
DropCreateDatabaseAlways
初始化程序一次让EF创建包含表格的数据库,然后再次删除初始化程序Seed
方法中的SQL代码写入数据库答案 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的脚本。