Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Application break accessing dbcontext, Asp .net core web api 2.0 with entity framework core 2.0 database first approach

I have developed asp .net core wep api 2.0 application with EntityFrameworkCore.SqlServer 2.0. It is developed using database first approach. When trying to access entities using dbcontext application is going to break mode. I cannot find the reason for application state to going break state. Please help to resolve this.

Below is the OnConfiguring method in DBContext class.

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            optionsBuilder.UseSqlServer(@"Server=(local);Database=VotingAppDB;User ID=sa;Password=123;");
        }
    }

Below code block used to access dbcontext entities in controller

    // GET api/values
    [HttpGet]
    public IEnumerable<string> Get()
    {
        VotingAppDBContext context = new VotingAppDBContext();
        var questions = context.Questions.ToList();
        return new string[] { "value1", "value2" };
    }

Installed packages

Application error

like image 611
bhathiya.m Avatar asked Aug 24 '17 04:08

bhathiya.m


2 Answers

1.- First of all you shouldn't create a context inside the controller, avoid use 'new' with dependencies because that would make your code untestable, in my case as I use UnitOfWork I inject it as IUnitOfWork instance that is, indeed, an extension of MyConext, and you'd inject it within the StartUp class... To do so I have a private method (to perform this in a single private call) that looks like:

 private void AddEntityFrameworkAndDbContext(IServiceCollection services)
        {
            services.AddEntityFrameworkSqlServer();

            var migrationsAssemblyName = typeof(MyContext).GetTypeInfo().Assembly.GetName().Name;
            services.AddDbContext<MyContext>(options =>
            {
                options.UseSqlServer(
                    "MY CONNECTION STRING GOES HERE (BUT I RETREIVE IT FROM ANOTHER SERVICE)",
                    sqlServerOptionsAction: sqlOptions =>
                    {
                        sqlOptions.MigrationsAssembly(migrationsAssemblyName);
                        sqlOptions.EnableRetryOnFailure(maxRetryCount: 5, maxRetryDelay: TimeSpan.FromSeconds(30), errorNumbersToAdd: null);
                    });
            },
            ServiceLifetime.Scoped  // Showing explicitly that the DbContext is shared across the HTTP request scope (graph of objects started in the HTTP request)
                   ).AddUnitOfWork<MyContext>(); // This is because I'm also using EF Core Unit of work NuGet Package
        }

I'm calling that private method from ConfigureServices(IServiceCollection services), as I said, in StartUp class

        // Add EF, and UoW
        AddEntityFrameworkAndDbContext(services);

2.- Secondly (but I'd say that this is your real problem) I'd say that you missed base.OnConfiguring(options); in your context, it should be like:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            optionsBuilder.UseSqlServer(@"Server=(local);Database=VotingAppDB;User ID=sa;Password=123;");
        }
        base.OnConfiguring(optionsBuilder);
    }

Also, please, take a look at this answer I wrote few weeks ago: How to setup EF6 Migrations with ASP.NET Core

In addition, that UnitOfWork project deserves a reading, take a look at it here: https://github.com/arch/UnitOfWork

I hope it helps,

Juan

like image 62
Juan Avatar answered Nov 16 '22 08:11

Juan


Not sure if the issue still exists. I've had the same issue today. The fix was to update all nuget packages (in my case, Microsoft.Extensions.Configuration, etc) to the latest version.

like image 41
Learning Savvy Avatar answered Nov 16 '22 09:11

Learning Savvy