2012-08-08 54 views
4

我是新来的ASP.NET MVC3无法删除数据库+ EF代码第一

我试图存储超过标准的ASP.NET成员提供额外的用户信息。我创建了一个新的实体UserAddress,并使用成员API将其与aspnet_tables同步。

不过,现在如果我做任何更改UserAddress类 - asp.net不删除并重新创建模型。我得到的错误,因为它是在使用

无法删除数据库。

我已搜查计算器和谷歌。基本上,我的问题是类似这样的

Database in use error with Entity Framework 4 Code First

但是,我不知道如何实现什么克里斯提出的解决方案:

“这是发生在我身上,因为我打电话对会员的方法DB和那是创建一个冲突。我解决这个迫使初始化器运行和种子之前使用会员制度“

我非常确定这是为什么数据库正在使用的原因,因为我的代码在数据存储库中的这一点:

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

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

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

这正是克里斯在堆栈溢出的问题指出我已经联系到我原来的问题

基本上,解决办法是迫使数据库initalize成员被调用之前。我不知道该怎么做。我试图通过输入URL访问用户地址页面来手动完成。然而,这不起作用,因为它在调用会员表的线路上再次失败。

正确的方式做,这是迫使应用程序启动初始化如下:

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

我只是在' db.Database.Initialize(true);'现在改为。 – mpen 2012-09-05 04:02:13

0

你在Global.asax中有你的初始化程序在你的Application_Start(),所以它的第一件事情发生呢?

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

这与此处推荐的方法类似 - http://www.asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/cs/adding-a-new-field。我现在正在完成本教程,但我决定使用SQL Server 2008(而不是.sdf数据库文件)。它看起来不适用于SQL Server连接(Windows身份验证),但是 - 跳闸的解决方案为我工作。我的观点是,所使用的连接类型和成员问题似乎是相关的。 – 2012-08-23 10:23:02

0

return db.UserAddress.SingleOrDefault(a => a.UserId == userid);看起来像什么控制器。

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

,看看它是能解决问题。

+0

不起作用。我试过这样做,但ToList的扩展是不允许的。 – Tripping 2012-08-09 07:19:42

7

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

如果这是你在做什么 - 试图启动您的项目之前,从SSMS的数据库断开连接。

+0

嗨StanK,我只是使用视觉Web开发人员,即使重新启动我的电脑,并且只通过视觉网络开发人员启动项目,这个问题依然存在 – Tripping 2012-08-09 07:16:21

+0

完美 - 这对我来说(EF 5.0) – 2013-10-10 08:26:30

0

我第一次使用MVC 4码与实体框架。我将我的会员资格移至其他数据库,将跳闸代码添加到Application_Start(),未使用SSMS,将代码移至启动方法的开头。就像(另一种)马克所说的那样,仍然有错误。

解决以下https://stackoverflow.com/a/7007818/2332919Pooling=false添加到我的连接字符串,这又让我去了,但在什么成本?

+1

这是一个答案或问题? – Stewie 2013-06-22 14:35:30