2013-01-11 34 views
8

Chúng tôi đang triển khai một ứng dụng ASP.NET MVC đơn giản đến trên các máy chủ dàn dựng của chúng tôi và chúng tôi đang gặp lỗi sau khi EntityFramework cố di chuyển cơ sở dữ liệu hiện có.Di chuyển EntityFramework cố gắng tạo một cơ sở dữ liệu hiện có

CREATE DATABASE permission denied in database 'master'. 

Tình hình là như sau:

  • Đây là lần đầu tiên di cư chạy.
  • Cơ sở dữ liệu đã tồn tại (nó thực sự là một cơ sở dữ liệu Umbraco).

Nó sẽ xuất hiện các phương pháp sau đây (từ EntityFramework) trả về false, khi nó rõ ràng nên trở thành sự thật:

System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists() 

Các initializer cơ sở dữ liệu có đoạn mã sau:

Database.SetInitializer(new MigrateDatabaseToLatestVersion<DataContext, Configuration>()); 

tự động di chuyển bị tắt, bởi vì chúng tôi đang sử dụng di chuyển dựa trên mã.

Chuỗi kết nối trỏ đến cơ sở dữ liệu chính xác và người dùng có quyền db_owner trên cơ sở dữ liệu đó. Người dùng không có quyền đối với các bảng khác trên máy chủ.

Đây có phải là sự cố thường gặp không? Có ai biết một giải pháp cho điều này?

Thnx!

+1

bạn có thể thử thiết lập nó để không bị thạc sĩ như đó là tên của một cơ sở dữ liệu hệ thống và có thể gây ra các vấn đề –

+0

trùng lặp có thể xảy ra [CREATE DATABASE permission bị từ chối trong cơ sở dữ liệu 'master' Entity Framework Migration] (http://stackoverflow.com/questions/11814762/create-database-permission-denied-in-database-master-entity-framework-migratio) –

+0

Cơ sở dữ liệu tên trong chuỗi kết nối không phải là chủ (vì đây thực sự là một cơ sở dữ liệu hệ thống). Đó là cơ sở dữ liệu hiện có và người dùng chỉ có quyền đối với db đó. EntityFramework cố gắng tạo cơ sở dữ liệu vì các EnsureDatabaseExists báo cáo rằng không có cơ sở dữ liệu. Sau đó EF cố gắng tạo DB, nhưng người dùng không có quyền đối với điều đó. Tuy nhiên, đó không phải là vấn đề. EF không phát hiện ra rằng db thực sự tồn tại vì một lý do nào đó –

Trả lời

1

Đảm bảo cơ sở dữ liệu tồn tại - thực thi kịch bản sau đây

IF db_id(N'MyDatabaseName') IS NOT NULL SELECT 1 ELSE SELECT Count(*) FROM sys.databases WHERE [name]=N'MyDatabaseName' 

rằng giả định người dùng được phép truy vấn 'sys.databases' cho một danh sách DB. Nếu truy vấn này không thành công - EF nghĩ rằng DB chưa được tạo và cố gắng tạo lại nó.

Hãy chắc chắn rằng - mà người dùng thực hiện cuộc di cư, có khả năng thực hiện các truy vấn trên thành công

+0

Hữu ích, nhưng làm cách nào bạn tìm ra điều này? Và thứ hai - chúng ta có thể khiến EF ngừng làm điều đó, không thích hợp với môi trường an toàn :) –

+0

tìm ra điều này - đã sử dụng một đoạn SQL từ cơ sở dữ liệu SQL chuẩn tạo ra tập lệnh, mà SSMS tạo ra. Và làm thế nào chúng ta có thể ngăn EF cố gắng tạo ra một cơ sở dữ liệu? Tôi nghĩ là có. Chỉ cần tạo trình khởi tạo DB tùy chỉnh thay vì dựa vào việc triển khai mặc định xuất hiện trong hộp – Marty

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