2011-11-07 16 views
5

Tôi có một cơ sở dữ liệu SqlServer Compact Edition chứa 2 bảng.Tôi có thể có 2 ngữ cảnh EntityFramework khác nhau dùng chung một cơ sở dữ liệu SqlServer nhỏ gọn không?

Đối với mỗi bảng, tôi có một lớp ngữ cảnh bắt nguồn từ DbContext được ứng dụng sử dụng để truy cập vào bảng.

Để giữ các thành phần khác nhau của ứng dụng được tách riêng, tôi không thể có một lớp ngữ cảnh có thuộc tính DbSet cho cả hai bảng. Thay vào đó, tôi cần phải có 2 lớp ngữ cảnh khác nhau, mỗi người trong số họ phải hoàn toàn không biết gì về dữ liệu khác và dữ liệu của nó.

Tôi đang sử dụng cách tiếp cận mã đầu tiên, mã của tôi xác định các thực thể và mô hình, và tôi để Entity Framework tạo cơ sở dữ liệu cho tôi.

Vấn đề của tôi là: làm thế nào tôi có thể để Entity Framework tạo cơ sở dữ liệu và các bảng cho tôi tự động khởi tạo ngữ cảnh, nhưng vẫn có 2 bối cảnh chia sẻ cùng cơ sở dữ liệu và kết nối?

Ngay bây giờ những gì tôi nhận được là, bối cảnh đầu tiên tạo thành công các cơ sở dữ liệu và bảng trong nó, nhưng khi tôi cố gắng tạo ra bối cảnh thứ hai, tôi nhận được, gì ngạc nhiên các lỗi sau:

The model backing the 'SomeObjectContext' context has changed since the database 
was created. Either manually delete/update the database, or call Database.SetInitializer 
with an IDatabaseInitializer instance. For example, the DropCreateDatabaseIfModelChanges 
strategy will automatically delete and recreate the database, and optionally seed it with 
new data. 

Không ai trong số IDatabaseInitializer có sẵn phù hợp với tôi, bởi vì tôi không muốn toàn bộ cơ sở dữ liệu bị xóa khi bối cảnh thứ hai được tạo ra. Tôi chỉ muốn bảng của bối cảnh thứ hai được tạo ra trong cơ sở dữ liệu hiện có.

Bất kỳ lời khuyên nào về cách giải quyết vấn đề này sẽ được đánh giá cao.

Cảm ơn

Trả lời

5

Bạn không thể sử dụng CodeFirst theo cách này chỉ với một cơ sở dữ liệu. CodeFirst phải kiểm tra các lớp mô hình đối với cấu trúc db để hoạt động đúng (chúng phải được "đồng bộ").

In order to keep the different components of the application decoupled, I can't have one context class that would have DbSet properties for both of the tables. Rather, I need to have 2 different context class, each of them has to be completely unaware of the other and its data.

Nếu bảng gian hàng không có kết nối với nhau và tại sao bạn không tạo hai cơ sở dữ liệu và có ngữ cảnh cho mỗi cơ sở dữ liệu?

Tóm lại, tôi sẽ đi với một cơ sở dữ liệu, có DbContext nội bộ và hai lớp kho lưu trữ công cộng khác nhau đóng gói quyền truy cập vào hai bảng. Nếu tất cả các mã của bạn nằm trong cùng một assembly, bạn có thể truy cập vào bối cảnh nội bộ của bạn từ lớp kho lưu trữ của bạn. Một người cần truy cập vào kho lưu trữ có thể truy cập vào kho lưu trữ cho bảng mà anh ta cần.

+2

Nó được vấn đề trong môi trường như Sql Azure, nơi bạn bị tính phí cho mỗi cơ sở dữ liệu ... – Clement

2

Có, bạn có thể sử dụng nhiều ngữ cảnh DB được trỏ đến cùng một DB.

Arthur Vickers từ nhóm Entity Framework đề xuất mẫu sau….

Thay vì chỉ định chuỗi kết nối riêng biệt trong tệp app.config của bạn cho nhiều ngữ cảnh, chỉ cần đặt một chuỗi và đặt tên chung cho nó.

<connectionStrings> 
     <add name="MyDBContext" connectionString="Your conn string here" providerName="System.Data.SqlClient" /> 
    </connectionStrings> 

Sau đó, tạo ra một lớp bối cảnh cơ sở đó sẽ sử dụng chuỗi kết nối:

using System.Data.Entity; 

namespace DataLayer 
{ 
    public class BaseContext<TContext> : DbContext where TContext : DbContext 
    { 
     static BaseContext() 
     { 
      Database.SetInitializer<TContext>(null); 
     } 
     protected BaseContext() 
      : base("name=MyDBContext") 
     { 
     } 

    } 
} 

Bây giờ, kế thừa hành vi cơ sở này trong từng ngữ cảnh (ví dụ):

namespace DataLayer.Models 

    { 
     public class OrderContext : BaseContext<OrderContext> 

    … 

    namespace DataLayer.Models 
    { 
     public class ProductContext : BaseContext<ProductContext> 
    … 
+0

Cảm ơn bạn đã trả lời. Câu hỏi của tôi đã được cụ thể cho một cơ sở dữ liệu SqlServer CE, và tôi nghĩ rằng cách tiếp cận bạn mô tả trong câu trả lời không giải quyết được vấn đề tôi có. Vấn đề đặc biệt là với cách mã đầu tiên và CE làm việc. – Ran

+0

Xin lỗi Ran. Có thể đã hiểu lầm câu hỏi của bạn .... – tom33pr