I have a data access class which looks something like below, using CompanyX.DataAccess.CompanyXTableAdapters; namespace CompanyX.DataAccess { public class CompanyXDataAccess { #region Invoice public CompanyX.InvoiceDataTable GetInvoiceByID(int ID) { InvoiceTableAdapter ta = new InvoiceTableAdapter(); using (ta.Connection = new SqlConnection(DB.GetReaderConnectionString())) { return ta.GetByID(ID); } } public CompanyX.InvoiceDataTable GetInvoice(string userSID) { InvoiceTableAdapter ta = new InvoiceTableAdapter(); using (ta.Connection = new SqlConnection(DB.GetReaderConnectionString())) { return ta.Get(userSID); } } public void DeleteInvoice(int ID) { InvoiceTableAdapter ta = new InvoiceTableAdapter(); using (ta.Connection = new SqlConnection(DB.GetWriterConnectionString())) { ta.Delete1(ID); } } public void UpdateInvoice(Invoice m) { InvoiceTableAdapter ta = new InvoiceTableAdapter(); using (ta.Connection = new SqlConnection(DB.GetWriterConnectionString())) { ta.Update1(m.ID, ... n numbers of params ..., m.ModifiedBy); } } #endregion // more regions for modules come in here with CRUD and other queries } } So I first created stored procedures for CRUD operations, READ operation are much complex then other operations so I prefer to keep it as it is. Second I created a `CompanyX.xsd` file, then I dropped tables and stored procedures from `SQL Server Object Explorer` and then added stored procedures to it, [![enter image description here][1]][1] **Questions** How can I improve this approach of data access layer ? - I think we can use any design pattern and break things into classes to make it more readable without losing much of performance ? - Use a different technology like EF Database first ? **Please Note** - I had to change names in code and trim screenshot for company privacy reasons - <strike> I prefer to keep using stored procedures </strike> at least for Read operations but open to use EF for create, delete or update (but this will change accordingly to needs) [1]: https://i.sstatic.net/42rHe.png