2013-06-13 28 views
14

Tôi mới sử dụng MVC và tôi đang cố gắng sử dụng trình khởi tạo để khởi tạo dữ liệu vào DB khi ứng dụng được bắt đầu lần đầu tiên. Dưới đây là những gì tôi đã có trong Global.asax.cs:Không thể thả cơ sở dữ liệu vì hiện tại đang sử dụng MVC

System.Data.Entity.Database.SetInitializer(new MyAppInitializer()); 
MyAppContext db = new MyAppContext(); 
db.Database.Initialize(true); 

Trong Web.config, đây là chuỗi kết nối của tôi:

<connectionStrings> 
    <add name="MyAppContext" 
    connectionString="data source= MyServer; Integrated Security=True; database=MyDatabase" 
    providerName="System.Data.SqlClient"/> 

này đang sử dụng MS SQL 2008 R2 . Trình khởi tạo của tôi trông giống như sau:

public class MyAppInitializer : DropCreateDatabaseAlways<MyAppContext> 
{ 
    protected override void Seed(MyAppContext context) 
    { 
     var organizations = new List<Organizations> 
     { 
      new Organizations { OrgName = "AT", OrgPhone = 5093333433, OrgOfficeLocation = "ITB", OrgPointOfContact = "Tony", OrgIsActive = 1 }, 
      new Organizations { OrgName = "Libraries", OrgPhone = 5093331122, OrgOfficeLocation = "Holland-Terrell", OrgPointOfContact = "Herald", OrgIsActive = 1 } 
     }; 
     organizations.ForEach(s => context.Organizations.Add(s)); 
     context.SaveChanges(); 

Tôi đảm bảo đã đóng kết nối với máy chủ và cơ sở dữ liệu trong SQL Server Management Studio, mặc dù không có ai sử dụng nó ngay bây giờ. Làm thế nào tôi có thể nhận được nó để tôi có thể khởi tạo dữ liệu này trong DB của tôi? Cảm ơn!

Chỉnh sửa: Tôi đã tạo DB trên máy chủ nhưng hoàn toàn trống (không có bảng, thủ tục, v.v.). Điều này có gây ra sự cố không?

Trả lời

19

Trong SSMS chạy một cái gì đó như thế này ...

USE master -- be sure that you're not on MYDB 
ALTER DATABASE MYDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
DROP DATABASE MYDB; 
+0

Tôi nhận được lỗi cú pháp: cú pháp không chính xác gần 'IMMEDIATE' tôi đã thực hiện và chạy nó, nhưng nó chỉ chạy trong khoảng 5 phút trước khi tôi dừng nó, trong trường hợp này tôi gặp lỗi này: Yêu cầu GIAO DỊCH ROLLBACK không tương ứng BEGIN GIAO DỊCH. – SantasNotReal

+0

VỚI ROLLBACK IMMEDIATE – Sam

+0

Làm việc cho *** LocalDB *** bằng cách sử dụng _mdf file_? bằng cách sử dụng 'Data Source = (LocalDB) \ v11.0; AttachDbFilename = | DataDirectory | \ wingtiptoys.mdf; Bảo mật tích hợp = True' – Kiquenet

41

tôi phải đối mặt với một vấn đề tương tự hiện nay khi sử dụng MVC codefirst. Sau 20 phút thử các công cụ khác nhau, tôi nhận thấy rằng, tab "Server Explorer" trong Visual Studio có một kết nối mở đến cơ sở dữ liệu của tôi. Sau khi tôi "đóng" kết nối trong tab máy chủ thám hiểm của studio trực quan, mã đã có thể chạy và tự động tạo lại cơ sở dữ liệu.

+1

Hài hước, Visual Studio (sử dụng VS 2015) mở kết nối và không thể tự xử lý trường hợp này! –

+1

@TwoPea Tôi đã có cùng một vấn đề với LocalDb đang được sử dụng trong một dự án mẫu MVC. Giải pháp của bạn đã giải quyết nó. – nam

+0

Đây là giải pháp thực tế và phải được chấp nhận làm câu trả lời, – Thinking

2

Trong cửa sổ "Xóa" SSMS, hãy đảm bảo chọn "Đóng các kết nối hiện có".

+0

Sau khi thử tất cả các cách này để đưa db xuống, tôi đóng SSMS, đóng các kết nối dữ liệu trong VS và sau đó đóng VS. Đã mở VS, được kiểm tra để đảm bảo các kết nối vẫn đóng, chạy ứng dụng. Điều đó hiệu quả. – JaneH

0

Đóng tất cả các kết nối hiện có của cơ sở dữ liệu trong trình khám phá máy chủ phòng thu trực quan và SQLManagement studio đã giải quyết được sự cố cho tôi.

+0

tôi có thể làm điều đó *** lập trình *** trong visual studio server explorer_ không? – Kiquenet

6

VS2015 close DB connection Như được mô tả bởi Vardhini ... đóng kết nối DB trong Server Explorer.

+0

'ALTER DATABASE MYDB SET SINGLE_USER VỚI ROLLBACK IMMEDIATE' áp dụng cho *** LocalDB ***? – Kiquenet

0

quan sát của tôi là:

  1. Không thể đăng nhập vào ứng dụng
  2. có thể không được kết nối với db với Server Explorer
  3. có thể không được kết nối với SSMS

Sau đó, ứng dụng xây dựng lại DB ngay cả khi Database.SetInitializer<DbContext>(new DbInitializer()); nằm trong số public DbContext(); - KHÔNG phải là câu trả lời khác để đặt nó vào Application_Start();

+0

Sau khi thử tất cả các cách này để đưa db xuống, tôi đóng SSMS, đóng các kết nối dữ liệu trong VS, và sau đó đóng VS. Đã mở VS, được kiểm tra để đảm bảo các kết nối vẫn đóng, chạy ứng dụng. Điều đó hiệu quả. – JaneH

Các vấn đề liên quan