2012-01-07 18 views
8

Tôi mới dùng LINQ to SQL và cố gắng tạo một đối tượng truy nhập dữ liệu chung (DAO) cho việc tạo, đọc, cập nhật và hủy bỏ cơ bản (CRUD) để tôi có thể sử dụng lại mã. Tôi đã thành công trong việc tạo một phương thức chung sẽ xóa bất kỳ thực thể nào bằng cách sử dụng mã bên dưới, nhưng tôi đã tự hỏi liệu có ai biết cách tạo một phương thức chung sẽ chọn bất kỳ thực thể nào bằng một trường Id chung tồn tại trên tất cả các bảng.Làm thế nào để tạo các đối tượng truy nhập dữ liệu chung (DAO) CRUD với LINQ to SQL

/// <summary> 
    /// Generic method that deletes an entity of any type using LINQ 
    /// </summary> 
    /// <param name="entity"></param> 
    /// <returns>bool indicating whether or not operation was successful</returns> 
    public bool deleteEntity(Object entity) 
    { 
     try 
     { 
      DomainClassesDataContext db = new DomainClassesDataContext(); 
      db.GetTable(entity.GetType()).Attach(entity); 
      db.GetTable(entity.GetType()).DeleteOnSubmit(entity); 
      db.SubmitChanges(); 
      return true; 
     } 
     catch(Exception ex) 
     { 
      Console.WriteLine(ex.StackTrace); 
      return false; 
     } 
    } 

Tôi khá chắc chắn rằng patter cùng sẽ làm việc để cập nhật và chèn và muốn có một phương pháp chung trên GenericDAO rằng sẽ lấy tôi bất kỳ thực thể (ví dụ khách hàng, hóa đơn, WorkOrder, vv ...) dựa trên Id thực thể. Cảm ơn những phản hồi hữu ích của bạn.

Trả lời

15

Tôi nghĩ rằng bạn đang tìm kiếm Repository Pattern, sau đây là một việc thực hiện đơn giản của nó:

Trước tiên, bạn cần phải tạo ra một giao diện IRepository như thế này:

public interface IRepository<T> where T : class 
{ 
    void Add(T entity); 
    void Delete(T entity); 
    void Update(T entity); 
    IEnumerable<T> All(); 
    ... 
} 

Sau đó:

public class Repository<T> : IRepository<T> 
    where T : class, IEntity 
{ 
    DataContext _db; 
    public Repository() 
    { 
     _db = new DataContext("Database string connection"); 
     _db.DeferredLoadingEnabled = false; 
    } 
    public void Add(T entity) 
    { 
     if (!Exists(entity)) 
      GetTable.InsertOnSubmit(entity); 
     else 
      Update(entity); 
     SaveAll(); 
    } 
    public void Delete(T entity) 
    { 
     GetTable.DeleteOnSubmit(entity); 
     SaveAll(); 
    } 
    public void Update(T entity) 
    { 
     GetTable.Attach(entity, true); 
     SaveAll(); 
    } 
    System.Data.Linq.Table<T> GetTable 
    { 
     get { return _db.GetTable<T>(); } 
    } 
    public IEnumerable<T> All() 
    { 
     return GetTable; 
    } 
} 

Sau đó:

public class CustomerRepository : Repository<Customer> 
{ 
    public ProductRepository() 
     : base() 
    { 
    } 
} 

Sau đó, bạn có thể có một cái gì đó như:

Customer newCustomer = new Customer { FistName = "Foo", LastName = "Boo" }; 
_customerRepository.Add(newCustomer); 

đâu Customer là một thực thể ánh xạ tới cơ sở dữ liệu của bạn được định nghĩa trong .dbml. Đây chỉ là khởi đầu, xem phần sau để biết thêm chi tiết:

+0

Cảm ơn bạn rất nhiều. Điều này hoạt động hoàn hảo. Tôi đã chỉ sử dụng Hibernate với Java trong quá khứ và khung đã được đưa ra. Bây giờ, tôi là nhà phát triển duy nhất làm việc trên một dự án từ đầu nên đây là lần đầu tiên tôi phải viết lớp truy cập dữ liệu của riêng mình bên ngoài một nhóm. Tôi ước tôi có đủ đại diện để bỏ phiếu cho giải pháp này. Tôi mới tham gia cộng đồng và chắc chắn sẽ bỏ phiếu này khi đại diện của tôi cao hơn. – Grasshopper

+0

@AaronMajor Glade để trợ giúp và chào mừng bạn đến với stackoverflow, BTW: bạn có thể đánh dấu câu trả lời là được chấp nhận nếu bạn thấy câu trả lời hữu ích thấy điều này: http://stackoverflow.com/faq#howtoask –

+0

@MahmoudGamal câu trả lời tuyệt vời. Có bắt buộc phải sử dụng một giao diện không, chúng ta chỉ cần định nghĩa một lớp đơn (Repository) và từ phương thức Action của controller Thêm hoặc cập nhật hoặc xóa một bản ghi. Cảm ơn – User