2012-08-08 77 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