2008-10-24 40 views
11

Tôi đang cố gắng tìm ra chiến lược tốt nhất về cách tổ chức DataContexts. DB điển hình chúng tôi làm việc có từ 50 đến 100 bảng thường ở dạng thứ ba bình thường và có nhiều mối quan hệ giữa chúng. Tôi nghĩ chúng tôi có hai tùy chọn:LINQ to SQL nhiều DataContext-s

  1. Đặt tất cả các bảng trong một ngữ cảnh. Điều này sẽ đảm bảo rằng bất cứ điều gì chúng tôi làm sẽ được cam kết theo đúng thứ tự trong cơ sở dữ liệu. Vấn đề là các nhà thiết kế LINQ sẽ là một mớ hỗn độn với hơn 50 bảng và tôi lo lắng hiệu suất có thể bị ảnh hưởng.
  2. Tạo một số ngữ cảnh dữ liệu dựa trên nhóm bảng hợp lý. Vấn đề là sẽ có những nơi mà một bên của một mối quan hệ sẽ được trong một bối cảnh và một bên trong một bối cảnh khác. Chúng tôi sẽ phải tự tay xử lý cả hai ngữ cảnh theo đúng thứ tự.

Có thực tiễn nào được đề nghị để xử lý việc này không?

Chi tiết khác:

Tôi muốn tạo các thực thể và đơn vị công việc của riêng mình trên LINQ to SQL. Các thực thể sẽ được định nghĩa trong một tệp mô hình xml nơi ánh xạ tới các thực thể LINQ cũng sẽ được chỉ định. Một công cụ tùy chỉnh sẽ tạo các thực thể của tôi (POCO) dựa trên mô hình. Mã máy khách sẽ chỉ tương tác với các thực thể của tôi và đơn vị công việc của tôi; không bao giờ trực tiếp với các thực thể DataContext hoặc LINQ. Tuy nhiên tôi không muốn sao chép những gì LINQ to SQL cung cấp ra khỏi hộp vì vậy tôi muốn sử dụng LINQ DataContext cơ bản. Điều này có nghĩa là tôi không thể có hai đơn đặt hàng trong các ngữ cảnh dữ liệu khác nhau, vì sẽ không thể lập bản đồ cho Lệnh POCO của tôi với cả hai lệnh đó.

Trả lời

0

Bạn nên tạo ngữ cảnh cho phép bạn thực hiện đơn vị công việc. Điều này có thể liên quan đến ánh xạ bảng chồng chéo.

Context1: Khách hàng có nhiều hóa đơn

Context2: Khách hàng có nhiều đơn đặt hàng

Context3: Hóa đơn có nhiều đơn đặt hàng

+0

Mặc dù vậy, nhưng không thể sử dụng Lệnh từ ngữ cảnh 2 trong Ngữ cảnh .... bạn sẽ kết thúc với hai thực thể đơn hàng khác nhau – Albert

+0

Nếu công việc được phân tách thành các đơn vị, bạn sẽ không bao giờ cố gắng sử dụng một đối tượng từ ngữ cảnh 2 trong ngữ cảnh3. –

+0

Tôi thực sự muốn triển khai các POCO và Đơn vị công việc trên các thực thể LINQ để mã máy khách sẽ làm việc với một UnitOfWork sẽ chỉ có một loại lệnh. Trong giải pháp được đề xuất của bạn, tôi sẽ không biết ngữ cảnh nào để sử dụng cho các đơn đặt hàng – Albert

2

ánh xạ LINQ-to-SQL là DataSets gõ như thế nào, ở chỗ khi bạn sử dụng một, bạn đang xử lý một phiên chứa dữ liệu. Bạn có thể có cùng một bảng trong một số DataContexts khác nhau. Họ chỉ là lớp học thôi; chúng không có ý nghĩa gì cho đến khi bạn bắt đầu tương tác với cơ sở dữ liệu, bằng cách điền chúng với dữ liệu hiện có hoặc sử dụng chúng để tạo dữ liệu mới.

Vì vậy, có lẽ bạn có các bảng Khách hàng, Địa chỉ, Điện thoại, v.v. mà bạn xử lý khi bạn gửi một danh mục mới. Sau đó, bạn có các bảng Hóa đơn, Chi tiết đơn hàng, Sản phẩm, v.v. mà bạn sử dụng khi tạo đơn đặt hàng. Nhưng trong phần sau, bạn có thể muốn có Khách hàng. Đó là tốt. Bạn chỉ nên cẩn thận để chỉ có một phiên hoạt động tại một thời điểm để bạn không sử dụng dữ liệu không nhất quán. Bạn không nên gặp sự cố khi chồng chéo các đối tượng trong các DataContexts khác nhau của bạn miễn là bạn không sử dụng chúng theo cách trùng lặp. Bạn có thể đặt DataContext của mình trong một không gian tên cụ thể và bạn cũng có thể đặt các thực thể khác nhau của mình vào một không gian tên cụ thể (mặc dù chỉ có một không gian tên trên một tập hợp các thực thể trong một DataContext). Bạn có thể làm điều này trong cửa sổ Properties. Điều này sẽ cho phép bạn giữ Intellisense ít lộn xộn hơn.

0

Tôi sử dụng một datacontext cho mỗi cơ sở dữ liệu.

Bảng trung bình có thể lên tới 100, tuy nhiên từ kinh nghiệm, tôi không gặp phải bất kỳ sự cố về hiệu suất nào.

Văn bản dữ liệu nằm trong một dự án riêng biệt, được biên soạn. Dll kết quả tham chiếu từ BLL

4

Đây là câu hỏi phổ biến mà đã được phân tích kỹ lưỡng ở đây: http://craftycode.wordpress.com/2010/07/19/linq-to-sql-single-data-context-or-multiple/

Về bản chất, bạn nên tạo ít nhất một bối cảnh dữ liệu cho mỗi nhóm kết nối mạnh mẽ của các bảng, hoặc một bối cảnh dữ liệu cho mỗi cơ sở dữ liệu.

+0

thuật ngữ ở đây, điều này có nghĩa là chỉ có một DataContext db = new DataContext(), xảy ra bên trong một phương pháp khóa một đối tượng (hoặc làm một cái gì đó để đảm bảo duy nhất một tồn tại cùng một lúc)? – paIncrease