sql-server - Entity Framework 代码优先自动创建表

标签 sql-server asp.net-mvc entity-framework

我试图了解 Entity Framework 到底在幕后做了什么,导致了我将要描述的观察到的行为。

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

我在本地主机上有一个名为 wpdb 的现有 MSSQL 数据库。

Web.config:

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

当我第一次运行网络应用程序时,它会神奇地自动创建 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; }
}

我使用 Entity Framework 添加一个新 Controller CommentsController 作为具有读/写操作和 View 的 MVC Controller (并选择我的“Comment”和“CommentDBContext”类) .

然后我添加一个新的连接字符串(显然 Entity Framework 的默认连接字符串不是“DefaultConnection”,而是最终无效的字符串,我不知道为什么)。

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

现在,当我浏览到 localhost/Comments 时, Entity Framework 会自动在我的数据库中创建一个名为 dbo.Comments 的新表。

到目前为止我所描述的一切都与预期完全一致,这就是它变得奇怪的地方

我不小心删除了dbo.Comments。但是,这次当我浏览到 localhost/Comments 时, Entity Framework 将不会重新创建该表。相反,它向我抛出“无效对象‘dbo.Comments’”错误。

为什么要这样做?为什么它不重新创建数据库?我什至尝试删除所有模型/ Controller / View 代码,清理/重建解决方案,然后再次重新创建它,并且 EF 仍然拒绝重新创建表!

更令人困惑的是,如果我注释掉 Web.config 文件中的 CommentDbContext 行(以便 EF 代码尝试连接到错误的数据库)然后运行应用程序并浏览到 /Comments,然后终止应用程序,取消注释连接字符串,这次它会创建一个全新的 dbo.Comments 表,没有任何问题!

为什么将连接字符串更改为无效内容然后将其更改回来允许 EF 再次从我的模型生成表?似乎有一些状态被保留在不应该的地方..

最佳答案

I accidentally deleted dbo.Comments. it throws an "Invalid object 'dbo.Comments'" error at me. Why does it do this?

因为您不应该按照配置的方式编辑/删除表。它不会自动将数据库对模型的更改以及模型的更改自动同步到数据库。

Why doesn't it just recreate the database?

因为你没有自动告诉它,也没有要求它这样做。

Why does changing then connection string to something invalid then changing it back allow EF to generate table from my models again?

因为它创建了一个表(忘记了名称),该表知道上次同步的时间以及它已创建和尚未创建的表。当您将连接字符串更改为没有该表的其他数据库时,它会重新创建所有内容。

您可能应该查看 MSDN 上的以下文章,并选择您希望 Entity Framework 如何适合您的场景:

Code First Migrations

关于sql-server - Entity Framework 代码优先自动创建表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25693376/

相关文章:

entity-framework - 我应该将 TransactionScope 与 DbContext 一起使用吗

c# - 如何: create a heat map of the market

c# - 从 Azure 数据湖下载文件

c# - 电子邮件验证器忽略空白

asp.net - 让经典 ASP 从 web.config 文件中的 appsettings 读取 key

c# - 将 OData 查询转换为 DataContract 模型类

c# - "Column names in each table must be unique."数据库更新期间

sql - 动态 SQL 传递表名并返回最大 ID 值

mysql - 数据库中已删除记录的数字主键是否会被重新用于 future 的新记录?

c# - SQL 查询 : Select Column1, 行数 (criteria1),行数 (criteria2)