无法删除数据库,因为它正在使用中 + EF 代码优先

Posted

技术标签:

【中文标题】无法删除数据库,因为它正在使用中 + EF 代码优先【英文标题】:Cannot drop database because it is in use + EF Code first 【发布时间】:2012-08-08 22:31:55 【问题描述】:

我是 asp .net mvc3 的新手

我正在尝试通过标准的 asp .net 会员提供程序存储其他用户信息。我创建了一个新实体 UserAddress,并使用会员 API 将其与 aspnet_tables 同步。

但是,现在如果我对 UserAddress 类进行任何更改 - asp.net 不会删除并重新创建模型。我得到了错误

无法删除数据库,因为它正在使用中。

我已经搜索了 *** 和谷歌。基本上我的问题是这样的

Database in use error with Entity Framework 4 Code First

但是,我不确定如何实施 chris 建议的解决方案:

“这发生在我身上,因为我正在针对 DB 调用 Membership 方法,这造成了冲突。我通过强制初始化程序在使用 Membership 系统之前运行和种子来解决这个问题”

我很确定这就是数据库正在使用的原因,因为我的代码此时在数据存储库中崩溃了:

var userid = Membership.GetUser.ProviderUserKey.ToString();
return db.UserAddress.SingleOrDefault(a => a.UserId == userid);

如何强制初始化器在会员系统之前运行?

我的代码片段如下:

public class UserAddress

    public int UserAddressId  get; set; 
    public string UserId  get; set; 
    public string FlatNo  get; set; 
    public string BuildingName  get; set; 
    public string Address1  get; set; 
    public string Address2  get; set; 
    public string PostCode  get; set; 
    public string City  get; set; 
    public string State  get; set; 
    public string Country  get; set; 
    public long MobilePhone  get; set; 


public class NPLHWebsiteDb : DbContext

    public DbSet<UserAddress> UserAddress  get; set; 


public class NPLHWebsiteInitializer : DropCreateDatabaseIfModelChanges<NPLHWebsiteDb>
    
        protected override void Seed(NPLHWebsiteDb context)
        
            var userAddress = new List<UserAddress>
            
                new UserAddress 
                    UserAddressId = 1,
                    UserId = "153",
                    FlatNo = "6.4",
                    BuildingName = "Wilton Plaza",
                    MobilePhone = 9810110123,
                
            ;
            userAddress.ForEach(a => context.UserAddress.Add(a));
            context.SaveChanges();
    

谢谢

【问题讨论】:

【参考方案1】:

我之前使用 SQL Server Management Studio 连接到 SqlExpress 数据库时遇到过这个问题,并且在我开始我的项目时打开了几个查询。

如果这是您正在做的 - 在开始您的项目之前尝试在 SSMS 中断开与数据库的连接。

【讨论】:

嗨 StanK,我正在使用可视化 Web 开发人员,即使我重新启动计算机并仅通过可视化 Web 开发人员启动项目,此问题仍然存在 完美 - 这为我做到了(EF 5.0)【参考方案2】:

怀疑罪魁祸首是“会员”。

代码使用成员资格来查找登录用户的地址。因此,如果我登录该网站,那么我的 Membership 表将被调用,并且 SQL 将不允许初始化程序删除并重新创建当前正在使用的表(即通过 Membership)。

这正是 Chris 在我在原始问题中链接到的堆栈溢出问题中指出的内容

基本上,解决方案是在调用 Membership 之前强制数据库初始化。我不知道该怎么做。我试图通过输入 URL 来手动访问用户地址页面。但是,这不起作用,因为它在调用成员资格表的行再次失败。

执行此操作的正确方法是在 Application start 中强制初始化,如下所示:

System.Data.Entity.Database.SetInitializer(new MyInitializer());          
MyContext db = new MyContext();         
db.Database.Initialize(true);

【讨论】:

我现在只是在db.Database.Initialize(true); 上得到了异常。【参考方案3】:

在 Global.asax 的 Application_Start() 中是否有初始化程序,所以它首先发生?

protected void Application_Start() 
    Database.SetInitializer(new NPLHWebsiteInitializer());

【讨论】:

这类似于这里推荐的方法 - asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/cs/…。我现在正在完成本教程,但我决定使用 SQL Server 2008(而不是 .sdf 数据库文件)。但是,它似乎不适用于 SQL Server 连接(Windows 身份验证)——Tripping 的解决方案对我有用。我的观点是,使用的连接类型和成员资格问题似乎相关。【参考方案4】:

return db.UserAddress.SingleOrDefault(a =&gt; a.UserId == userid); 的控制器是什么样子的。

我会试试,“return db.UserAddress.SingleOrDefault(a =&gt; a.UserId == userid).ToList()

并看到它可以解决问题。

【讨论】:

不起作用。我试过这样做,但不允许扩展 ToList。【参考方案5】:

我首先在实体框架中使用 MVC 4 代码。我将我的会员资格移动到另一个数据库,将 Tripping 的代码添加到 Application_Start(),我没有使用 SSMS,将代码移动到 start 方法的开头。就像(不同的)Mark 说的一样,仍然出现错误。

通过关注https://***.com/a/7007818/2332919 将Pooling=false 添加到我的连接字符串中解决了这个问题,这让我又开始了,但代价是什么?

【讨论】:

以上是关于无法删除数据库,因为它正在使用中 + EF 代码优先的主要内容,如果未能解决你的问题,请参考以下文章

无法删除数据库,因为它当前正在使用中

更新 ContextModelSnapshot EF Core

PostgreSQL 上的 EF Core 批量删除

无法使用 Ef Core 删除数据库迁移

无法执行 FunctionImport“entitys.xx”,因为未将它映射到存储函数。EF

使用 EF Core 进行级联删除