我试图理解实体框架在引发我将要描述的观察行为的引擎盖下做了什么。实体框架代码第一次自动创建表
这是一个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.UserProfile
,dbo.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; }
}
我添加了一个新的控制器CommentsController
为MVC控制器的读/写操作和视图,使用实体框架(并选择我的“注释”和“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从我的模型再次生成的表?似乎有一些状态被保存在某处它不应该是..
'因为它创建一个表(忘了名字),它知道“我想更多地了解这一点。你能把我链接到一些文档吗? – Dan 2014-09-05 20:25:31
我认为这个错过的一件事是:当他将它改回原始连接字符串时,为什么决定创建缺少的表?为什么在根本不弄错连接字符串之前没有检测到丢失的变化?我怀疑它只在应用程序启动时检查实体模型,并且因为它是一个MVC应用程序,所以直到改变了webconfig才启动。我怀疑他可能刚刚循环使用应用程序和/或IIS,并且它会自动重新创建表,而不会干扰连接字符串。 – AaronLS 2014-09-05 20:27:29
无论如何,如果DbContext的每个实例都必须执行完整的模式比较才能确定模型已更改,那将非常昂贵。不是对你的出色答案的批评,只是对OP的一些见解,他们为什么不在应用程序运行时自动执行此操作。 – AaronLS 2014-09-05 20:29:20