2014-09-05 95 views
2

我试图理解实体框架在引发我将要描述的观察行为的引擎盖下做了什么。实体框架代码第一次自动创建表

这是一个ASP.NET MVC 4 Internet应用程序项目。

我已经在本地主机上现有的MSSQL数据库称为wpdb

Web.config文件:

<add name="DefaultConnection" 
    connectionString="Data Source=localhost;Initial Catalog=wpdb;User=xxx;Password=xxx" 
    providerName="System.Data.SqlClient" /> 

当我第一次运行的Web应用程序,它会创建dbo.UserProfiledbo.webpages_Membership和其他几桌自动神奇。

我创建了一个新的模式Comments.cs

public class Comment 
{ 
    public int ID { get; set; } 
    public string Text { get; set; } 
} 

public class CommentDBContext : DbContext 
{ 
    public DbSet<Comment> Comments { get; set; } 
} 

我添加了一个新的控制器CommentsControllerMVC控制器的读/写操作和视图,使用实体框架(并选择我的“注释”和“CommentDBContext”类)。

然后我添加一个新的连接字符串(即最终被无效显然是实体框架的默认连接字符串不是“DefaultConnection”但事情,我不知道为什么)。

<add name="CommentDbContext" 
    connectionString="Data Source=localhost;Initial Catalog=wpdb;User=xxx;Password=xxx" 
    providerName="System.Data.SqlClient" /> 

现在,当我浏览到localhost/Comments实体框架自动神奇地在我的数据库称为dbo.Comments创建一个新表。到目前为止,我所描述的

一切是完全符合市场预期,这里的地方是会很奇怪

我不小心删除dbo.Comments。但是,这次当我浏览到localhost/Comments实体框架将不会重新创建表。相反,它会向我抛出一个“无效的对象'dbo.Comments'”错误。

它为什么这样做?为什么不重新创建数据库?我甚至尝试删除所有的模型/控制器/视图代码,清理/重建解决方案,然后重新创建它,EF仍然拒绝重新创建表!

什么是更加混乱,如果我在Web.config文件注释掉CommentDbContext线(这样EF代码试图连接到错误的数据库),然后运行该应用程序并浏览到/Comments,然后终止该应用中,取消连接字符串,这次它创建一个全新的dbo.Comments表没有任何问题!

为什么改变则连接字符串的东西无效,那么改变它回到允许EF从我的模型再次生成的表?似乎有一些状态被保存在某处它不应该是..

回答

2

我不小心删除了dbo.Comments。它抛出一个“无效的对象'dbo.Comments'”错误在我身上。它为什么这样做?

因为您不想按照配置方式编辑/删除表格。这不是同步模型和模型的数据库更改自动奇迹般地到数据库。

为什么不重新创建数据库?

因为你没有自动告诉它,也没有你问过它。

为什么改变连接字符串为无效然后改回它允许EF从我的模型再次生成表?

因为它创建了一个表(它忘记了名字),它知道它最后一次同步以及它有哪些表并且没有创建表。当您将连接字符串更改为不具有该表的其他数据库时,它会重新创建所有内容。

你或许应该看一看MSDN上的以下文章,并选择你想怎么实体框架,为您的方案工作:

Code First Migrations

+0

'因为它创建一个表(忘了名字),它知道“我想更多地了解这一点。你能把我链接到一些文档吗? – Dan 2014-09-05 20:25:31

+1

我认为这个错过的一件事是:当他将它改回原始连接字符串时,为什么决定创建缺少的表?为什么在根本不弄错连接字符串之前没有检测到丢失的变化?我怀疑它只在应用程序启动时检查实体模型,并且因为它是一个MVC应用程序,所以直到改变了webconfig才启动。我怀疑他可能刚刚循环使用应用程序和/或IIS,并且它会自动重新创建表,而不会干扰连接字符串。 – AaronLS 2014-09-05 20:27:29

+0

无论如何,如果DbContext的每个实例都必须执行完整的模式比较才能确定模型已更改,那将非常昂贵。不是对你的出色答案的批评,只是对OP的一些见解,他们为什么不在应用程序运行时自动执行此操作。 – AaronLS 2014-09-05 20:29:20