ASP .NET Core Publish Errors AddDbContext

0

i actually dont know deploy IIS for LAN server. We are working on this project together with my friend. We share same Wifi. So we want shared api project. Because i working on backend (API-DAL-BLL) layers, my friends working on FrontEnd. But i cant deploy very well. First my publish cant see my DBContext.So i added Startup addDbContext.

My Startup.cs like this

 public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<GastroDB>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
            services.AddScoped<IMainCategoryService, MainCategoryService>();
       }

My Program.cs like this

public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseKestrel().UseContentRoot(Directory.GetCurrentDirectory()).UseUrls("myIpAdress:80").UseIISIntegration().UseStartup<Startup>();
                });
    }

But iis can not get start. This is my errors ;

  1. .Net Runtime:
Description: The process was terminated due to an unhandled exception.
Exception Info: System.ArgumentException: 'AddDbContext' was called with configuration, but the context type 'GastroDB' only declares a parameterless constructor. This means that the configuration passed to 'AddDbContext' will never be used. If configuration is passed to 'AddDbContext', then 'GastroDB' should declare a constructor that accepts a DbContextOptions<GastroDB> and must pass it to the base constructor for DbContext.

2)IIS AspNetCore Module V2

Application '/LM/W3SVC/1/ROOT' with physical root 'C:\Users\Tuğçe\Desktop\almanya projesi BE\EcommerceGastro.API\bin\Release\net5.0\publish\' hit unexpected managed exception, exception code = '0xe0434352'. First 30KB characters of captured stdout and stderr logs:
Unhandled exception. System.ArgumentException: 'AddDbContext' was called with configuration, but the context type 'GastroDB' only declares a parameterless constructor. This means that the configuration passed to 'AddDbContext' will never be used. If configuration is passed to 'AddDbContext', then 'GastroDB' should declare a constructor that accepts a DbContextOptions<GastroDB> and must pass it to the base constructor for DbContext.

I understand i will shoul add my context constructor like this

    public GastroDB(DbContextOptions<GastroDB> options):base(options){}

But i cant add because first start like that on DBContext:

public class GastroDB : DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer("server=.; database=GastroDB; user id=sa; password=123;");

        }

        private static GastroDB _dbInstance;

        public static GastroDB DBInstance
        {
            get
            {
                if (_dbInstance == null)
                {
                    _dbInstance = new GastroDB();
                }
                return _dbInstance;
            }
        }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.ApplyConfiguration(new MyMap());
          ...
        }
        public DbSet<MyClass> MyClass{ get; set; }
        ....
    }
}

If i add ctor on this code, my some services throw exeption because i use like this

 using (var transaction = new GastroDB())
            {
                var productList = transaction.Set<DBProduct>().Include(x => x.ProductImage).ToList();
                return this.mapper.Map<List<Product>>(productList);
            }

How can i fix this problems i dont know how. Please help me

asp.net
entity-framework
asp.net-core
iis
asp.net-apicontroller
asked on Stack Overflow Apr 28, 2021 by aaliakinci

1 Answer

0
  1. You Should create a constructor that accept DbContextOptions<GastroDB>.

  2. You don't need to use public static GastroDB DBInstance because DbContext are registerd as Scoped life time.

public class GastroDB : DbContext
{
    public GastroDB(DbContextOptions<GastroDB> options)
          : base(options)
    {
    }
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("server=.; database=GastroDB; user id=sa; password=123;");
    }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.ApplyConfiguration(new MyMap());
          ...
    }
    public DbSet<MyClass> MyClass{ get; set; }
        ....
    }
}

3 . If you want your DbContext register as singleton lifetime you can use below code instead of create a static property in DbContext

services.AddDbContext<GastroDB>(options => 
{
    options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))
}, ServiceLifetime.Singleton);
answered on Stack Overflow Apr 28, 2021 by Farhad Zamani • edited Apr 28, 2021 by Farhad Zamani

User contributions licensed under CC BY-SA 3.0