J'utilise le code EF6 en premier et, au début, je place la chaîne de connexion dans un fichier texte appelé 'Settings.txt'Migration avec chaîne de connexion dynamique dans Entity Framework code-first (chaîne de connexion du fichier texte)
les données contenues dans le fichier 'Settings.txt' est
DataProvider: sqlserver
DataConnectionString: Data Source=.\SQLEXPRESS;Initial Catalog=MyDb;Integrated Security=True;Persist Security Info=False;Enlist=False;
Voici ce que j'utilise pour la classe dbContext
:
public class DbDataContext : BaseDbContext
{
static DbDataContext()
{
Database.SetInitializer(new ContextInitializer());
}
public DbDataContext():base() { }
public DbDataContext(string nameOrConnectionString)
: base(nameOrConnectionString) { }
...
}
[DbConfigurationType(typeof(MyDbConfiguration))]
public abstract partial class BaseDbContext : DbContext, IDbContext
{
public BaseDbContext() : this(GetConnectionString())
{ }
public BaseDbContext(string nameOrConnectionString) : base(nameOrConnectionString)
{ }
public static string GetConnectionString()
{
if (DataSettings.DataSettings.Current.IsValid())
{
return DataSettings.DataSettings.Current.DataConnectionString;
}
throw Error.Application("A connection string could not be resolved for the parameterless constructor of the derived DbContext. Either the database is not installed, or the file 'Settings.txt' does not exist or contains invalid content.");
}
}
public class MyDbConfiguration : DbConfiguration
{
public MyDbConfiguration()
{
IEfDataProvider provider = null;
try
{
provider = (new EfDataProviderFactory(DataSettings.DataSettings.Current).LoadDataProvider()) as IEfDataProvider;
}
catch {
}
if (provider != null)
{
base.SetDefaultConnectionFactory(provider.GetConnectionFactory());
}
}
}
public partial class EfDataProviderFactory : DataProviderFactory
{
public EfDataProviderFactory()
: this(DataSettings.DataSettings.Current){ }
public EfDataProviderFactory(DataSettings.DataSettings settings)
: base(settings) { }
public override IDataProvider LoadDataProvider()
{
var providerName = Settings.DataProvider;
if (providerName.IsEmpty())
{
throw new Exception("Data Settings doesn't contain a providerName");
}
switch (providerName.ToLowerInvariant())
{
case "sqlserver":
return new SqlServerDataProvider();
case "sqlserverce":
return new SqlServerCeDataProvider();
default:
throw new Exception(string.Format("Unsupported dataprovider name: {0}", providerName));
}
}
}
public class SqlServerDataProvider : IEfDataProvider
{
public virtual IDbConnectionFactory GetConnectionFactory()
{
return new SqlConnectionFactory();
}
public bool StoredProceduresSupported
{
get { return false; }
}
public DbParameter GetParameter()
{
return new SqlParameter();
}
public string ProviderInvariantName
{
get { return "System.Data.SqlClient"; }
}
}
J'utilise une fonction statique dans 'BaseDbContext' classe appelée 'GetConnectionString()'
Cette fonction permet de renvoyer la chaîne de connexion du fichier texte. Ce comportement fonctionne très bien lors de l'exécution, mais il ne fonctionne pas lors de l'ajout d'une migration.
C'est le problème: comment puis-je ajouter une migration de cette façon, en sachant que quand je mets la chaîne de connexion directement dans la fonction comme celui-ci
public static string GetConnectionString()
{
return (@"Data Source=.\\SQLEXPRESS;Initial Catalog=MyDb;Integrated Security=True;Persist Security Info=False;Enlist=False;");
}
la commande Add-Migration
travaille
Comment puis-je résoudre ce problème sans forcer la chaîne de connexion dans le code?
merci pour votre formation –
Vous êtes les bienvenus – Diana