【问题标题】:EF CodeFirst: DropCreateDatabaseIfModelChanges doesn't workEF CodeFirst:DropCreateDatabaseIfModelChanges 不起作用
【发布时间】:2011-03-21 09:48:44
【问题描述】:

我在 Global.asax 中使用以下代码:

DbDatabase.SetInitializer<MyDBContext>
   (new DropCreateDatabaseIfModelChanges<MyDBContext>());

但它似乎不起作用。

虽然我的模型已更改并且我正在尝试使用新添加的表格之一,但它只是说找不到该表格。

Invalid object name 'dbo.TableName'.

如果我运行它,它似乎可以工作,并且正在创建表:

DbDatabase.SetInitializer<MyDBContext>(new DropCreateDatabaseAlways<MyDBContext>());

它确实更新了我的数据库。

我做错了什么?

【问题讨论】:

  • 不,我的意思是 IncludeMetadataConvention。你删除了吗?您的数据库中有 EdmMetadata 表吗?
  • 顺便说一句。 “模型”和“表格”是什么意思?
  • 模型是指我的项目中的一个或多个实体。例如 public class ObjectName { [Key] public int Id { get;放;我所说的表是指在我的 SQL 数据库中创建的表。
  • 原来是master数据库的用户权限。奇怪的是,使用 DropCreateDatabaseAlways 不需要主数据库的权限,而 IfModelChanges 则需要。
  • @reinder:非常有趣。我不知道。将其发布为您问题的答案。我会赞成它。顺便提一句。这是否意味着它的 SQL 抛出了被 EF 吞噬的异常?

标签: c# entity-framework ef-code-first entity-framework-4.1


【解决方案1】:

不管怎样,我在使用 两种 DropCreate 策略时遇到了很多麻烦,因为关闭浏览器后 Cassini 仍在运行。 (我在使用 IIS Express 时遇到了同样的问题。)因为本地 Web 服务器仍在运行,Application_Start 没有再次触发,所以我放在那里的初始化从未执行。

我通过启用“编辑并继续”解决了这个问题:

项目属性 > Web > 调试器 > 启用编辑并继续

这会在浏览器关闭时强制本地 Web 服务器关闭。

【讨论】:

  • 我在带有 cassini 的 MVC3 应用程序中使用它。我发现如果我在修改我的模型类之后重新运行我的解决方案,然后再次运行,那么 drop/create 就可以完成它的工作。
  • 如果您点击调试或运行而不调试,这通常是 Visual Studio 中的默认操作,我看到这种情况发生的唯一原因是如果您修改代码然后只需重新导航到该站点而不重建
【解决方案2】:

原来是master数据库的用户权限。奇怪的是,使用 DropCreateDatabaseAlways 不需要主数据库的权限,而 IfModelChanges 则需要。

【讨论】:

【解决方案3】:

我遇到了同样的问题:

Database.SetInitializer(new DropCreateDatabaseIfModelChanges<BreakAwayContext>());

就我而言,当我添加上述代码行时,数据库已经存在。我删除了数据库并再次运行我的程序,它开始按预期工作。只有其他冲突可能是我一直在使用数据库上的“启用迁移”的原因。

HTH

【讨论】:

    【解决方案4】:

    如果您删除了 IncludeMetadataConvention,则会出现这种行为: modelBuilder.Conventions.Remove&lt;System.Data.Entity.Database.IncludeMetadataConvention&gt;();

    【讨论】:

    • 在这种情况下会,但事实并非如此。
    猜你喜欢
    • 2015-01-15
    • 2015-04-16
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多