5

我是 asp .net mvc3 的新手

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

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

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

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

Entity Framework 4 Code First 的数据库使用错误

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

“这发生在我身上,因为我正在针对数据库调用 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();
    }

谢谢

4

5 回答 5

7

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

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

于 2012-08-09T02:43:55.707 回答
5

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

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

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

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

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

System.Data.Entity.Database.SetInitializer(new MyInitializer());          
MyContext db = new MyContext();         
db.Database.Initialize(true);
于 2012-08-09T13:24:19.777 回答
0

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

protected void Application_Start() {
    Database.SetInitializer(new NPLHWebsiteInitializer());
}
于 2012-08-09T00:27:01.990 回答
0

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

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

并看到它可以解决问题。

于 2012-08-09T02:15:02.790 回答
0

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

通过遵循https://stackoverflow.com/a/7007818/2332919添加Pooling=false到我的连接字符串来解决,这让我再次开始,但代价是什么?

于 2013-06-22T14:13:18.170 回答