2017-04-13 1 views
0

J'ai un contexte qui dérive de DbContext comme celui ci-dessous:chaîne de connexion passe au code EF DbContext premier

public class StudentContext : DbContext 
{ 
public StudentContext(string connectionString) : base(connectionString) 
{ 
} 
protected override void OnModelCreating(DBModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 
    System.Data.Entity.Database.SetInitializer(new MigrateDatabaseToLatestVersion<StudentContext, StudentMigrations.Configuration>()); 
} 

public DbSet<Students> Students {get; set;} 
} 

Je suis en train de passer la chaîne de connexion par:

studentContext = new StudentContext(settings.ConnectionString) 

Le les paramètres sont chargés au moment de l'exécution en lisant un fichier de configuration. J'ai essayé this et j'ai également essayé de définir la chaîne de connexion à l'intérieur du constructeur StudentContext en utilisant this.Database.Connection.ConnectionString. Dans les deux cas, j'obtiens une exception qui me demande de fournir un constructeur par défaut ou de fournir une implémentation de IDbContextFactory. La seule chose qui fonctionne est la suivante:

public class StudentContext : DbContext 
{ 
    public static string ConnectionString; 
public StudentContext(string connectionString) : base(ConnectionString = connectionString) 
{ 
} 

//And also provide a default implementation of the DbContext constructor: 
public StudentContext() : base(ConnectionString) 
{ 
} 

protected override void OnModelCreating(DBModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 
    System.Data.Entity.Database.SetInitializer(new MigrateDatabaseToLatestVersion<StudentContext, StudentMigrations.Configuration>()); 
} 

public DbSet<Students> Students {get; set;} 
} 

Je suis en train de réduire l'utilisation de statics dans le code et donc si je pouvais obtenir la première option de travailler, ce serait génial.

Répondre

2

Il s'avère que la chaîne de connexion est mise en cache dans une chaîne readonly pour MigrateDatabaseToLatestVersion from this answer. Je devais juste mettre à jour la classe à:

public class StudentContext : DbContext 
{ 
    public StudentContext(string connectionString) : base(connectionString) 
    { 
    } 

    protected override void OnModelCreating(DBModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 
     System.Data.Entity.Database.SetInitializer(new MigrateDatabaseToLatestVersion<StudentContext, StudentMigrations.Configuration>(true)); //Passing true here to reuse the client context triggering the migration 
    } 

    public DbSet<Student> Students {get; set;} 
} 
0

Nous devons spécifier la chaîne de connexion d'entité. dans DbContexte

SqlConnectionStringBuilder sqlString = new SqlConnectionStringBuilder() 
     { 
    DataSource = "SOURAV-PC", // Server name 
    InitialCatalog = "efDB", //Database 
      UserID = "sourav",   //Username 
      Password = "mypassword", //Password 
     }; 
     //Build an Entity Framework connection string 

     EntityConnectionStringBuilder entityString = new EntityConnectionStringBuilder() 
     { 
      Provider = "System.Data.SqlClient", 
      Metadata = "res://*/testModel.csdl|res://*/testModel.ssdl|res://*/testModel.msl", 
      ProviderConnectionString = sqlString.ToString() 
     }; 
     return entityString.ConnectionString; 
    }