我试图理解世界上实体框架正在做什么导致我将要描述的观察到的行为。
这是一个ASP.NET MVC 4 Internet应用程序项目。
我在localhost上有一个名为wpdb
的现有MSSQL数据库。
的Web.config:
<add name="DefaultConnection"
connectionString="Data Source=localhost;Initial Catalog=wpdb;User=xxx;Password=xxx"
providerName="System.Data.SqlClient" />
当我第一次运行网络应用时,它会自动创建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控制器,带有读/写操作和视图,使用实体框架(并选择我的&#34;评论&#34;和&#34 ;评论DBContext&#34;类)。
然后我添加了一个新的连接字符串(显然是Entity Framework的默认连接字符串isn&#39; t&#34; DefaultConnection&#34;但是最终无效的东西,我不知道为什么)。
<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
实体框架时不会重新创建表格。相反,它会抛出一个&#34;无效的对象&#39; dbo.Comments&#39;&#34;我的错误。
为什么这样做?为什么它不重新创建数据库?我甚至尝试删除所有模型/控制器/视图代码,清理/重建解决方案,然后再次重新创建它,EF仍然拒绝重新创建表格!
如果我在CommentDbContext
文件中注释Web.config
行(以便EF代码尝试连接到错误的数据库),那么更令人困惑的是,然后运行应用程序并浏览到/Comments
,然后终止应用程序,取消注释连接字符串,这次它创建了一个全新的dbo.Comments
表,没有任何问题!
为什么将连接字符串更改为无效然后将其更改回来允许EF再次从我的模型生成表格?似乎有一些国家被保留在它不应该的地方......
答案 0 :(得分:2)
我不小心删除了dbo.Comments。它向我抛出“无效对象'dbo.Comments'”错误。为什么这样做?
因为您不希望按照配置方式编辑/删除表格。它不是同步数据库对数据库模型和模型的自动变化。
为什么不重新创建数据库呢?
因为你没有自动告诉它,也没有你要求它。
为什么将连接字符串更改为无效然后将其更改回来允许EF再次从我的模型生成表格?
因为它创建了一个表(忘记了名称),该表知道上次同步以及它有哪些表但尚未创建。当您将连接字符串更改为不具有该表的其他数据库时,它会重新创建所有内容。
您应该查看MSDN上的以下文章,并选择您希望Entity Framework如何适用于您的方案: