5

Tôi đã sử dụng EF 4.1 (Mã đầu tiên) trong một dự án MVC 3 một thời gian trở lại, và nó là tốt.Entity Framework 4.3.1 không tạo (/ mở) cơ sở dữ liệu [Threading Anomaly?]

Hôm nay tôi cố gắng sử dụng EF 4.3.1 (Mã Đầu tiên) trong một dự án WinForms và gặp phải một số voodoo thực: (Dự án ban đầu tôi đã làm việc trên là WinForms, tuy nhiên điều này cũng đúng cho gắn Mã ứng dụng Console.)

Khi cố gắng nhập một lớp đơn giản vào cơ sở dữ liệu, tôi nhận ngoại lệ sau: Không thể mở cơ sở dữ liệu "Kiểm tra" được yêu cầu bởi thông tin đăng nhập. Đăng nhập thất bại. Đăng nhập không thành công cho người dùng '[Tên máy tính] \ [Quản trị viên]'.

Tôi đã thử kiểm tra cấu hình SQL Server (2008 R2) nhưng người dùng của tôi không có tất cả các quyền trên máy chủ.

LƯU Ý: Các Cơ sở dữ liệu không không tồn tại khi tôi lần đầu tiên chạy ứng dụng.

Thậm chí mẫu mã sau đây không làm việc:

class Program 
{ 
    public static void Main() 
    { 
     var person = new Person { Name = "Nathan" }; 
     using (var db = new MyContext()) 
     { //#1 
      db.Persons.Add(person); 
      db.SaveChanges(); 
     } 
     Console.Write("Person saved !"); 
     Console.ReadLine(); 
    } 
} 

public class Person 
{ 
    public int PersonId { get; set; } 
    public string Name { get; set; } 
} 

public class MyContext : DbContext 
{ 
    public DbSet<Person> Persons { get; set; } 
    public MyContext() 
     : base("Data Source=localhost;Database=Test;Integrated Security=True;") 
    { } 
} 

Tôi đã thử cài đặt lại EF 4.3.1 - vô ích. Khởi động lại SQL-Server cũng không có hiệu lực.

LƯU Ý: Tôi đã nhận thấy khá nhiều câu hỏi tương tự xung quanh, nhưng không ai đều giống như tôi đã trả lời - đây của tôi hy vọng tôi sẽ có được may mắn ở đây :)

Để làm rõ: Người dùng bị từ chối truy cập là Chủ sở hữu (người quản trị cục bộ) của máy.

EDIT: tôi đã chạy một vài thí nghiệm và tôi đã tìm thấy một cái gì đó khá lạ:

Nếu tôi tạm dừng chương trình tại cửa sổ dòng đánh dấu "# 1" và kiểm tra giá trị của db. Database.Exists() qua cửa sổ Xem, Nó cho tôi biết: "Đánh giá chức năng yêu cầu tất cả chuỗi chạy" với nút wavey này có thể nhấp để chạy tất cả chuỗi. Image depicting the above paragraph

Nếu tôi bấm vào nút chức năng để đánh giá False.

Bây giờ tôi có thể làm điều:

  1. Tiếp tục thực hiện: Trong trường hợp này tôi nhận được cùng một ngoại lệ chính xác.
  2. Thực thi db.Database.Tạo() từ cửa sổ Xem: Trong trường hợp này chương trình chạy thành công đến cuối và tôi thấy Cơ sở dữ liệu, Bảng và Hàng được tạo trong SQL Management Studio của tôi.

Có vẻ như một giải pháp đơn giản, đúng không? Sai rồi!

Tôi đã thử tiền tố truy cập dữ liệu bằng một cuộc gọi đến db.Database.CreateIfNotExists(); nhưng sau đó tôi nhận được cùng một ngoại lệ chính xác trên dòng đó.

db.Database.Initialize (true); không có tác dụng hoặc ...

LƯU Ý: Nếu bằng cách sử dụng các phương pháp trên tôi có thể tạo cơ sở dữ liệu, tôi có thể sử dụng nó đúng cách từ thời điểm đó trở đi, vì vậy đó là ít nhất một nửa an ủi: P Vấn đề là, tất nhiên, điều gì xảy ra khi tôi thêm DropCreateIfModelChanges hoặc DropCreateAlways Bộ phận đầu vào (vì tôi đang ở giữa quá trình phát triển tích cực của mô hình).

Cảm ơn.

[Tôi nghi ngờ đó là chi tiết của một vấn đề Entity Framework hơn SQL Server.]

+0

Bạn có thể kết nối với cơ sở dữ liệu bằng thông tin đăng nhập mà không cần EF (ví dụ: từ Visual Studio hoặc Sql Server Management Studio) không? – Pawel

+0

Vâng, bằng cách sử dụng Studio quản lý tôi có thể làm bất cứ điều gì tôi muốn trong Cơ sở dữ liệu, bao gồm tạo Cơ sở dữ liệu, Bảng, cập nhật hàng, v.v. –

+0

Bạn có sử dụng bảo mật tích hợp không? – Pawel

Trả lời

14

Bạn có thể thấy ngoại lệ này khi gỡ lỗi nếu bạn xảy ra để có "phá vỡ khi ngoại lệ được ném" tùy chọn (Debug-> Excptions) đã bật. EF đang cố gắng kết nối với cơ sở dữ liệu nhưng nó không thành công vì cơ sở dữ liệu không tồn tại nên một ngoại lệ được ném ra. Bạn thấy ngoại lệ do tùy chọn ở trên được bật. Ngoại lệ này thực sự bị chặn bởi Entity Framework và sau đó EF sẽ kết nối với cơ sở dữ liệu chủ để tạo cơ sở dữ liệu mà nó đang cố gắng kết nối trong bước đầu tiên. Một khi cơ sở dữ liệu được tạo ra, nó sẽ lại sử dụng chuỗi kết nối ban đầu để nói chuyện với cơ sở dữ liệu. Vì vậy, bạn có thể nhấn F5 để tiếp tục gỡ lỗi vì ngoại lệ là ngoại lệ cơ hội đầu tiên sẽ được xử lý hoặc vô hiệu hóa tắt "ngắt khi ngoại lệ được ném", điều này sẽ chỉ vi phạm các ngoại lệ không được xử lý thay vì tất cả ngoại lệ Bị ném.

+0

Thật tuyệt vời! Tôi bật tính năng vi phạm vì một lỗi mà tôi gặp phải và đang cố tìm, nhưng quên tắt nó đi. Cảm ơn! –

+0

Người đàn ông của tôi! Về cơ bản tôi thay đổi mô hình của tôi mà gây ra một ngoại lệ legit được ném, bật phá vỡ cho các loại SqlException và mặc dù mô hình đã không được tạo ra vẫn còn .... Tất cả tôi phải làm là lần lượt vi phạm cho rằng ngoại lệ một lần nữa và nó sẽ tạo ra mô hình sau khi ném nó một vài lần ... –

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