无法删除数据库,因为它正在使用中 + 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 => a.UserId == userid);
的控制器是什么样子的。
我会试试,“return db.UserAddress.SingleOrDefault(a => 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