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