无法删除数据库,因为它正在使用 + EF Code First

5

我是asp .net mvc3的新手。

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

然而,如果我对UserAddress类进行任何更改- asp.net不会删除和重新创建模型。我会收到以下错误:

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

我已经在stackoverflow和google上搜索过了。基本上,我的问题类似于这个:使用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();
    }

谢谢

5个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
7

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

如果您也是这样做的,请尝试在启动项目前断开SSMS中的数据库连接。


嗨,StanK,我只是使用Visual Web Developer,即使我重新启动计算机并仅通过Visual Web Developer启动项目,这个问题仍然存在。 - Tripping
完美 - 这对我有用(EF 5.0) - Pedro G. Dias

5

正如我们所怀疑的,罪魁祸首是“Membership”。

该代码使用成员身份查找已登录用户的地址。因此,如果我登录网站,则我的Membership表将被调用,并且SQL将不允许初始化程序删除和重新创建表格,因为它目前正在使用中(即由Membership使用)。

这正是Chris在我最初提出问题时在stackoverflow上指出的问题。

基本上,解决方案是在调用Membership之前强制数据库进行初始化。我不确定如何做到这一点。我试图手动输入URL以访问用户地址页面。但是,这又失败了,因为它再次在调用membership表的行处失败了。

正确的方法是在Application start中强制初始化,如下:

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

6
现在我只是在 db.Database.Initialize(true); 上面遇到了异常。 - mpen

0
你在Global.asax的Application_Start()方法中是否有初始化器,以便它是第一件要发生的事情?
protected void Application_Start() {
    Database.SetInitializer(new NPLHWebsiteInitializer());
}

这类似于此处推荐的方法 - http://www.asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/cs/adding-a-new-field。我现在正在完成这个教程,但我决定使用SQL Server 2008(而不是.sdf数据库文件)。然而,它似乎不能使用SQL Server连接(Windows身份验证) - Tripping的解决方案对我有用。我的观点是,所使用的连接类型和Membership问题似乎有关。 - Aaron Newton

0

我正在使用MVC 4的Code First和Entity Frame。我将我的成员资格移动到另一个数据库中,添加了Tripping的代码到Application_Start(),不使用SSMS,将代码移到了开始方法的开头。仍然遇到了错误,就像(另一个)Mark所说的那样。

通过按照https://dev59.com/c2w05IYBdhLWcg3w0VKa#7007818的方法将Pooling=false添加到我的连接字符串中来解决问题,这让我重新开始了,但代价是什么呢?


0

这段代码中的控制器是什么样子的 return db.UserAddress.SingleOrDefault(a => a.UserId == userid);

我会尝试使用 "return db.UserAddress.SingleOrDefault(a => a.UserId == userid).ToList()" 来解决问题。

看看这样是否修复了问题。


不起作用。我尝试过这样做,但是ToList的这个扩展是不允许的。 - Tripping

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,