2008-10-21 32 views
13

Các cách yêu thích của bạn để đóng gói các lớp thực thể LINQ to SQL và các lớp ngữ cảnh dữ liệu vào các đối tượng nghiệp vụ là gì?LINQ to SQL các lớp thực thể và bối cảnh dữ liệu: gói đối tượng kinh doanh

Bạn đã tìm thấy điều gì để làm việc trong một tình huống cụ thể?

Bạn đã phát minh hoặc đưa đến bất kỳ mẫu cụ thể nào chưa?

+0

Đặt thành cộng đồng wiki. – roosteronacid

Trả lời

3

Tôi đã tìm thấy một mô hình mà tôi nghĩ rằng hoạt động tốt nhất - Trong trường hợp của tôi, ít nhất.


Tôi mở rộng các lớp thực thể sử dụng các lớp một phần. Tôi sử dụng các lớp học một phần để chữ ký của thực thể không thay đổi (xem các cuộc gọi DeleteOnSubmit trong phương thức Delete).

Tôi đã nấu một ví dụ nhỏ.Dưới đây là một hình ảnh của cơ sở dữ liệu và LINQ to setup lớp SQL:



Và đây là partial class trong đó tôi thực hiện logic kinh doanh:

/// <summary> 
/// This class extends BusinessLogicDataContext.Products entity class 
/// </summary> 
public partial class Product 
{ 
    /// <summary> 
    /// New up a product by column: dbo.Products.ProductId in database 
    /// </summary> 
    public Product(Int32 id) 
    { 
     var dc = new BusinessLogicDataContext(); 

     // query database for the product 
     var query = (
      from p in dc.Products 
      where p.ProductId == id 
      select p 
     ).FirstOrDefault(); 

     // if database-entry does not exist in database, exit 
     if (query == null) return; 

     /* if product exists, populate self (this._ProductId and 
      this._ProductName are both auto-generated private 
      variables of the entity class which corresponds to the 
      auto-generated public properties: ProductId and ProductName) */ 
     this._ProductId = query.ProductId; 
     this._ProductName = query.ProductName; 
    } 


    /// <summary> 
    /// Delete product 
    /// </summary> 
    public void Delete() 
    { 
     // if self is not poulated, exit 
     if (this._ProductId == 0) return; 

     var dc = new BusinessLogicDataContext(); 

     // delete entry in database 
     dc.Products.DeleteOnSubmit(this); 
     dc.SubmitChanges(); 

     // reset self (you could implement IDisposable here) 
     this._ProductId = 0; 
     this._ProductName = ""; 
    } 
} 

Sử dụng logic kinh doanh thực hiện:

// new up a product 
var p = new Product(1); // p.ProductId: 1, p.ProductName: "A car" 

// delete the product 
p.Delete(); // p.ProductId: 0, p.ProductName: "" 

Hơn nữa: các lớp thực thể LINQ to SQL rất cởi mở trong tự nhiên. Điều này có nghĩa là thuộc tính tương ứng với cột dbo.Products.ProductId thực hiện cả trình khởi động và trình đổi - trường này không thể thay đổi được.

Theo hiểu biết của tôi bạn không thể ghi đè các thuộc tính sử dụng các lớp học phần, vì vậy những gì tôi thường làm là thực hiện một người quản lý mà thu hẹp đối tượng sử dụng một giao diện:

public interface IProduct 
{ 
    Int32 ProductId { get; } 

    void Delete(); 
} 
1

Hiện tại tôi đang cố gắng sử dụng các lớp thực thể LINQ to SQL làm đối tượng nghiệp vụ, để truyền chúng giữa các hàm và dịch vụ.

Tất nhiên, bạn cần có các lớp thực thể riêng biệt để truy cập cơ sở dữ liệu, do đó bố cục cơ sở dữ liệu của bạn có thể thay đổi mà không thay đổi đối tượng nghiệp vụ!

Tôi muốn được quan tâm nhất đến giải pháp tốt cho điều này!

0

Tôi đã thực hiện một số thử nghiệm sử dụng Entity Framework và LINQ to Entities như một cách để tách biệt mã khách hàng khỏi cơ sở dữ liệu, nhưng tôi thấy nó vụng về để sử dụng và lo lắng về hiệu năng.

Trong dự án hiện tại của tôi, tôi sử dụng LINQ to SQL làm lớp dữ liệu của mình, nhưng có các lớp riêng biệt nơi tôi triển khai tất cả các truy vấn LINQ. Các lớp trả về các thực thể được định nghĩa trong ngữ cảnh LINQ to SQL của tôi, nhưng các truy vấn được ẩn trong các phương thức.

1

Kiểm tra mã nguồn cho các ứng dụng mẫu MVC rằng Rob Conery được đặt lại với nhau:

http://www.codeplex.com/mvcsamples/

Ông có một lớp thực thể riêng biệt mà các bản đồ với LINQ to SQL lớp.

2

Tôi có xu hướng sử dụng mẫu Kho lưu trữ để đóng gói DataContexts.

Repository Pattern

Tôi muốn tìm một cách tốt hơn để phát ra đối tượng POCO từ lớp dữ liệu của tôi trong khi sử dụng LINQ2SQL mặc dù.

0

Tôi tìm thấy các bài viết của Ian Cooper on CodeBetter.comStephen Walther loạt vô giá trong việc hiểu cần phải viết các thực thể POCO trước và sau đó ánh xạ chúng vào cơ sở dữ liệu thay vì thực hiện theo cách khác (đó là những gì tôi thường làm).

0

Tôi đang chơi xung quanh với ý tưởng để có một lớp riêng biệt của mô hình OO (hỗ trợ tốt hơn cho các thực hành OO), nhưng sử dụng LINQ to SQL dưới mui xe. Ý tưởng là có một tệp xml mà một công cụ tùy chỉnh sẽ sử dụng để tạo mã. Vì các yêu cầu LINQ to SQL quá lộn xộn cho các sở thích của tôi, tôi sẽ tự động tạo các lớp mới để sử dụng như các thực thể của tôi và dĩ nhiên DataContext sẽ hoàn toàn bị ẩn cho mã máy khách. Câu trả lời ngắn gọn là: Tạo các lớp thực thể mới nhưng sử dụng các thực thể LINQ to SQL cơ bản và DataContext.

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