2013-03-26 32 views
7

Tôi có một ứng dụng sử dụng hai mô hình riêng biệt được lưu trữ trong một cơ sở dữ liệu duy nhất. Mô hình đầu tiên được thiết lập với di chuyển và là mô hình đã tạo dữ liệu di chuyển trong cơ sở dữ liệu. Thứ hai là một mô hình rất đơn giản mà không cần xác nhận mẫu nào cả - các bảng nó sử dụng tồn tại và có cấu trúc thích hợp. Ngữ cảnh thứ hai hoạt động tốt trong một cơ sở dữ liệu riêng biệt với cùng một cấu trúc bảng.Có thể có dữ liệu DbContext Bỏ qua Di chuyển/Phiên bản trong Cơ sở dữ liệu không?

Vấn đề là nó không thành công khi chạy trong cùng một cơ sở dữ liệu với mô hình đầu tiên vì nó cung cấp một số loại xác thực mô hình. Nó phàn nàn rằng ngữ cảnh đã thay đổi kể từ lần cập nhật cuối cùng, nhưng tất nhiên dữ liệu di chuyển không chứa bất kỳ điều gì về các bảng của ngữ cảnh thứ hai.

Có thể tắt xác thực siêu dữ liệu cho ngữ cảnh và chỉ để bối cảnh thứ hai hoạt động với các bảng như vậy, vì tôi biết rằng nó hoạt động?

trong hàm tạo ngữ cảnh nhưng điều đó không có hiệu lực.

+0

Tôi nghĩ rằng tôi hiểu những gì bạn đang cố gắng để làm. Bạn đang sử dụng một DBInitializer ở tất cả? – timothyclifford

+0

Cấu hình.AutoDetectChangesEnabled = false; Tắt theo dõi thay đổi trên các thực thể đôi khi cần thiết vì lý do hiệu suất. Xem http://blog.oneunicorn.com/2012/03/11/secrets-of-detectchanges-part-2-when-is-detectchanges-called-automatically/. –

Trả lời

10

Giải pháp là sử dụng triển khai trình khởi tạo cơ sở dữ liệu "không làm gì" mà về cơ bản không làm gì cả.

public class QueueMessageManagerContextInitializer : IDatabaseInitializer<QueueMessageManagerContext> 
{ 
    protected void Seed(QueueMessageManagerContext context) 
    {    
    } 

    public void InitializeDatabase(QueueMessageManagerContext context) 
    { 
     // do nothing 
     Seed(context); 
    } 
} 

Để sử dụng trong một mã khởi động thời gian sau đó:

[ClassInitialize()] 
    public static void MyClassInitialize(TestContext testContext) 
    { 
     //Database.SetInitializer<QueueMessageManagerContext>(new DropCreateDatabaseIfModelChanges<QueueMessageManagerContext>()); 
     Database.SetInitializer<QueueMessageManagerContext>(new QueueMessageManagerContextInitializer()); 
    } 

Đơn giản nhưng không rõ ràng giải pháp.

Edit:

Ngay cả giải pháp đơn giản: Chỉ cần vượt qua NULL với phương pháp SetInitializer():

Database.SetInitializer<QueueMessageManagerContext>(null); 
+1

Chết tiệt đánh tôi với nó :) đẹp nhất! – timothyclifford

+1

Các "giải pháp đơn giản hơn" làm việc cho tôi. – Andy

+0

Nếu bạn thấy điều này không hoạt động như mong đợi thì hãy kiểm tra phần EF của tệp cấu hình của bạn. Đảm bảo bối cảnh của bạn có disableDatabaseInitialization = "true". Tôi mất quá nhiều giờ và không ai đề cập đến nó trong câu trả lời của họ ở đây. Bạn có thể tìm thêm thông tin về cài đặt này ở cuối https://msdn.microsoft.com/en-us/data/jj556606 –

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