Initialize dbcontext for repository in base class C#

1k views Asked by At

I have alot of repository class which used DbContext variable. What is the best practices to initialize this DbContext variable?

I'm trying to do this in Base class with inheritance IDisposable, but my application make alot of operation in one time and i got DataReader is busy error. But when i use inside this function: using(var _entities = MyDbContext.Create()) all are fine? what can be a problem and what is best way to fix it?

now my base class look like this:

public abstract class BaseRepository : IDisposable
    {
        protected readonly MyDbContext_entities;
        public BaseRepository()
        {
            _entities = MyDbContext.Create();
        }
        #region Implement IDisposable
        private bool disposed = false;

        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    _entities.Dispose();
                }
            }
            this.disposed = true;
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
        #endregion
    }

and one of my repo used get this value with constructor:

public MyRepo():base(){};

function MyDbContext.Create():

public static MyDbContext Create()
{
      return new MyDbContext();
}
2

There are 2 answers

1
MikeSW On

The best practice is to inject the DbContext instance into the constructor or even better to inject a Func<DBContext> and then you can control the lifecycle of the db context on per method basis. And you won't be needing a base class for this purpose anymore.

This of course requires to use a DI Container, which is trivial in asp.net mvc.

1
Fàhmi Rizàl Hilmi On

I think you lack of space between the _entities variable type and the variable name.

and if your MyDbContext.Create() is returning something other than MyDbContext type, i think you should make some generic collections return value. and so you can dispose your entities without 'var' for _entities type for each method, you would use your generic type instead.

if you haven't try generic feature of c# you can try to look for a topic for generic class and generic method.