【问题标题】:Cannot delete database because it is in use (with Membership)无法删除数据库,因为它正在使用(具有成员资格)
【发布时间】:2013-05-05 21:49:18
【问题描述】:

我正在我的 EF codefirst Seed 方法中尝试以下操作:

protected override void Seed(TestDbContext context)
        {
            SqlConnection.ClearAllPools();
            context.Database.Delete();
            context.Database.CreateIfNotExists();

            if (!WebMatrix.WebData.WebSecurity.Initialized)
            {
                  WebSecurity.InitializeDatabaseConnection("DefaultConnection",  "UserProfile", "UserId", "UserName", autoCreateTables: true);
            }
        }

此操作失败,并显示错误“无法删除,因为数据库当前正在使用中”。它似乎只发生在我运行我的 Api 项目之后,它初始化了它自己与成员表的连接:

private class SimpleMembershipInitializer
        {
            public SimpleMembershipInitializer()
            {
                Database.SetInitializer<UsersContext>(null);

                try
                {
                    using (var context = new UsersContext())
                    {
                        if (!context.Database.Exists())
                        {
                            // Create the SimpleMembership database without Entity Framework migration schema
                            ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
                        }
                    }
                    if (!WebMatrix.WebData.WebSecurity.Initialized)
                    {
                        WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId",
                                                                 "UserName", autoCreateTables: true);
                    }
                }
                catch (Exception ex)
                {
                    throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex);
                }
            }
        }

知道如何通过代码实现此功能(我正在尝试自动化测试)吗?

【问题讨论】:

  • 快速而肮脏的方法就是在运行创建/种子脚本之前删除数据库。在 SSMS 中,您可以选择在删除数据库时关闭现有连接。
  • 这就是我现在正在做的事情......这是自动化测试的更大努力的一部分,所以如果可以的话,我想将所有内容都转移到代码中。这一定是一种常见的情况……对吧?
  • 您当然可以在运行创建/种子脚本之前运行 SQL 脚本来终止活动连接。但就从 C# 代码运行它而言,它并不是特别自动化:(
  • 你有一个时间问题,Membership 事情可能在 Db 初始化程序之前触发(过滤器?)。

标签: c# asp.net asp.net-web-api ef-code-first integration-testing


【解决方案1】:

在服务器资源管理器中,右键单击您与该数据库的数据连接并选择关闭连接。

【讨论】:

  • 那么您可能需要考虑 SSDT。您将数据库保存在解决方案中的单独项目中。它还允许对 Db 进行版本控制等,并且您可以在生产时通过 1 次更新将所有更改导入 SQL Server。只需使用 DACSAC 文件
  • 您可以将代码优先设置为仅在模型更改时删除/创建,或者仅在 db 不存在时。如果您根本不希望它丢失,则会创建一个包含哈希值的表。这就是用来确定是否有任何变化。删除该表,然后手动对 db 进行任何更改
  • 为什么要投反对票?当我回答您试图使用代码关闭连接时,问题并不清楚。
  • 我确实希望它放弃。我只是不想手动删除它。
  • 如果您有时间观看,Scott Allen 有一个很好的视频教程。它描述了将 DropDatabaseIfModelChanges 添加到 global.asax 以及种子方法。这是他的 MVC3 视频的一部分,但 EF 位只是您需要的位。将在几秒钟内查看链接
猜你喜欢
  • 2011-11-20
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多