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

asp.net-core asp.net-core-mvc asp.net-core-webapi entity-framework-6 entity-framework-core

Question

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

1
7
8/25/2017 9:58:17 AM

Popular Answer

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

2
6/20/2019 12:57:22 PM


Related Questions





Related

Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow