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

时间:2012-08-08 22:31:56

标签: sql asp.net-mvc-3 entity-framework-4.1

我是asp .net mvc3的新手

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

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

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

我搜索了stackoverflow和google。基本上,我的问题与此类似

Database in use error with Entity Framework 4 Code First

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

“这种情况发生在我身上,因为我正在调用针对数据库的成员资格方法,而这正在产生冲突。我通过强制初始化程序在使用成员资格系统之前运行和播种来解决这个问题”

我很确定这就是为什么数据库正在使用的原因,因为我的代码在数据存储库中的这一点上已经过时了:

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();
    }

由于

5 个答案:

答案 0 :(得分:7)

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

如果您正在执行此操作 - 请在启动项目之前尝试断开SSMS中的数据库。

答案 1 :(得分:5)

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

代码使用成员资格查找登录用户的地址。因此,如果我登录该网站,那么我的会员表将被调用,并且SQL将不允许initalizer丢弃并重新创建当前正在使用的表(即通过成员资格)。

这正是克里斯指出我在原始问题中链接到的堆栈溢出问题

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

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

我会尝试,“return db.UserAddress.SingleOrDefault(a => a.UserId == userid).ToList()

并且看到它解决了这个问题。

答案 4 :(得分:0)

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

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