Search code examples
c#entity-frameworkunity-container

EF multiple constructor with connection string using unity container : "The underlying provider failed on Open"


I'm using ef 6 and unity container. when i don't initialize default dbcontext constructor then unity can't recognize controller injection.but when initialize default dbcontext constructor and i use

Database.SetInitializer<EfDbContext>(null);

that time it throw "The underlying provider failed on Open" and Cannot attach the file Migrations.EfDbContext.mdf Db Migrations error

public EfDbContext() : base()
{
    Database.SetInitializer<EfDbContext>(null);
}

public EfDbContext(string connectionString) : base(connectionString)
{
   Database.SetInitializer<EfDbContext>(null);
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}

Call from Service

public JsonResult Something()
{
    using (var db = new EfDbContext("con1"))
    {
        db.Database.Connection.Open();
        var data = db.Database.SqlQuery<Something>("SELECT * FROM [dbo].[Table]").ToList();
        db.Database.Connection.Close();
    }
    ..............
}

And UnityConfig

public static void RegisterComponents()
{
    var container = new UnityContainer();

    container.RegisterType(typeof(IService<>), typeof(Service<>));
    ConventionRegistrar.Configure(container);

    GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
}

Solution

  • Please Try..

    public EfDbContext() : this("Pass Your Default Connection String")
    {
    
    }
    
    public EfDbContext(string connectionString) : base(connectionString)
    {
    
    }
    //DBSet's
    
    protected override void OnModelCreating(DbModelBuilder modelBuilder)  
    {
    
     base.OnModelCreating(modelBuilder);
    
     Database.SetInitializer<ApplicationDbContext>(null);
    
     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    
     //... Fuluent api
    }
    

    Hopefully it will be worked.