2012-01-07 4 views
8

के साथ सीआरयूडी तरीके बनाने के लिए मैं LINQ से SQL में नया हूं और बुनियादी बनाएं, पढ़ें, अद्यतन करें और नष्ट करें के लिए एक सामान्य डेटा एक्सेस ऑब्जेक्ट (डीएओ) बनाने का प्रयास कर रहा हूं (सीआरयूडी) विधियों ताकि मैं कोड का पुन: उपयोग कर सकूं। मैं एक सामान्य विधि बनाने में सफल रहा था जो नीचे दिए गए कोड का उपयोग करके किसी भी इकाई को हटा देगा, लेकिन मैं सोच रहा था कि अगर कोई सामान्य विधि कैसे बनाना है जो किसी भी इकाई को किसी भी आईडी आईडी फ़ील्ड द्वारा मौजूद किसी भी आईडी का चयन करेगा।जेनरिक डेटा एक्सेस ऑब्जेक्ट (डीएओ) सीआरयूडी तरीके कैसे LINQ से 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; 
     } 
    } 

मैं बहुत यकीन है कि एक ही गपशप अद्यतन के लिए काम करते हैं और सम्मिलित करें और GenericDAO पर एक सामान्य विधि है कि मुझे किसी भी संस्था को पुनः प्राप्त करेगा करना चाहते हैं जाएगा (यानी ग्राहक, चालान, WorkOrder, आदि हूँ ...) संस्था आईडी पर आधारित है। जवाब के लिए अग्रिम धन्यवाद।

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

तो: आप इस तरह एक अंतरफलक IRepository बनाने की जरूरत

पहले:

उत्तर

15

मुझे लगता है कि आप Repository Pattern लिए देख रहे हैं, निम्नलिखित इसके बारे में एक सरल कार्यान्वयन है

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; 
    } 
} 

फिर:

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

तो फिर तुम जैसे कुछ हो सकता है:

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

कहाँ Customer अपने डेटाबेस जो .dbml में परिभाषित किया गया है करने के लिए मैप किया गया एक इकाई है। यह सिर्फ एक शुरुआत है, अधिक जानकारी के लिए निम्नलिखित देखें:

+0

आपको बहुत बहुत धन्यवाद। यह पूरी तरह से काम करता है। मैंने अतीत में जावा के साथ केवल हाइबरनेट का उपयोग किया है और ढांचा पहले से ही मौजूद था। अब, मैं एकमात्र डेवलपर हूं जो एक परियोजना पर खरोंच से काम कर रहा है, इसलिए पहली बार मुझे टीम के बाहर अपनी डेटा एक्सेस लेयर लिखनी पड़ी। काश मैं इस समाधान को वोट देने के लिए पर्याप्त प्रतिनिधि था। मैं समुदाय के लिए नया हूं और जब मेरा प्रतिनिधि अधिक होगा तो इसे वोट देना सुनिश्चित होगा। – Grasshopper

+0

@AaronMajor Glade stackoverflow में मदद और स्वागत करने के लिए, बीटीडब्ल्यू: अगर आप इसे उपयोगी पाते हैं तो आप उत्तर को स्वीकार कर सकते हैं: http://stackoverflow.com/faq#howtoask –

+0

@MahmoudGamal महान उत्तर। क्या इंटरफ़ेस का उपयोग करना अनिवार्य है, क्या हम केवल एक वर्ग (रिपोजिटरी) को परिभाषित नहीं कर सकते हैं और नियंत्रक की एक्शन विधि से एक रिकॉर्ड जोड़ या अपडेट या हटा सकते हैं। धन्यवाद – User