Non, il faut activer la migration sur ton projet :
Enable-Migrations -ProjectName "monprojetDAL" -StartUpProjectName "monprojet"
Tout dépend de comment tu as architecturé ton projet.
Personnellement j'ai une librairie DAL (Data Access Layer) et la migration est dedans puisque c'est elle qui s'occupe de l'accès à la données.
Pour une base de données vide :
Add-Migration Version_1 -ProjectName "monprojetDAL" -StartUpProjectName "monprojet"
Dans la classe configuration ajouter :
AutomaticMigrationsEnabled = false;
Ensuite il faut ouvrir la base et la migrer si elle existe ou la créer si elle n'existe pas.
Je met le code brute :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| static public void InitDatabaseModel(Type _typeDatabaseManagerContext)
{
// Analyse et migration de la base de données
try
{
//using(TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted }))
{ // Permet de faire un rollback si la création / Mise à jour de la BDD échoue
// Initialisation
Configuration configuration = new Configuration();
configuration.ContextType = _typeDatabaseManagerContext;
var migrator = new DbMigrator(configuration);
// This will update the schema of the DB
migrator.Update(); // This will run Seed() method
// scope.Complete(); // Commiter
}
}
catch (AutomaticMigrationsDisabledException)
{ // ici, pas besoin de lancer l'exception, la version de la base de données à changée
}
catch (Exception)
{ // renvoyer l'exception plus haut
throw;
}
// Ne pas faire ce code dans le catch (AutomaticMigrationsDisabledException) car si une exception
// est levée elle ne pourra plus être catchée et il faut le faire au cas où la migration a fonctionnée
GeneralProvider provider = new GeneralProvider();
EntityGeneral general = provider.GetGeneral();
if (general == null)
{ // Création de la base, ajouter le schéma actuel
WPFExtToolkit.Logger.Log.Info(String.Format("Initialisation de la version du schéma de la base de donnée : {0}", DatabaseManagerContext.DATABASE_SCHEMA_VERSION));
provider.Create(new EntityGeneral { SchemaVersion = DatabaseManagerContext.DATABASE_SCHEMA_VERSION });
// Créer la table des profiles
ProfileProvider.CreateProfiles();
// Création de la base : ajouter l'utilisateur Admin, asssocié au groupe admin
WPFExtToolkit.Logger.Log.Info("Création du compte administrateur");
EntityUtilisateur user = new EntityUtilisateur();
user.MotPasseClair = "monmotpasse";
user.Login = "Admin";
EntityProfile profileAdmin = new ProfileProvider().GetProfile(EntityProfile.Type.Administrateur);
user.ListProfiles.Add(profileAdmin);
UtilisateurProvider userProvider = new UtilisateurProvider();
userProvider.Create(user); // Ajoute l'utilisateur et lui assigne le profile administrateur
}
else
{ // La version de la BDD doit être <= à cette version de programme
if (general.SchemaVersion > DatabaseManagerContext.DATABASE_SCHEMA_VERSION)
{
throw new Exception("Le programme DataManager est incompatible avec version de la base de données\n\nVeuillez mettre à jour le programme.");
}
else if (general.SchemaVersion < DatabaseManagerContext.DATABASE_SCHEMA_VERSION)
{ // Mettre à jour le N° de version de la base de données en concordance avec la version du programme
// sachant que la migration a fonctionnée donc la version actuelle du schéma est egal à celui du
// programme
Log.Info(String.Format("Mise à jour de la version du schéma de la base de donnée : {0}", DatabaseManagerContext.DATABASE_SCHEMA_VERSION));
general.SchemaVersion = DatabaseManagerContext.DATABASE_SCHEMA_VERSION;
provider.Update(general);
}
}
} |
Je teste pas mal de choses : Si c'est une création de base (la table n'a pas de ligne, general == null) alors je crée l'utilisateur par défaut ainsi que la liste des différents profiles de l'application.
Je met à jour la table générale avec la version du schéma de la base.
Si c'est une mise à jour (version géneral < version du logiciel) je met à jour la table général avec le bon n° de version.
Sinon, ça a fonctionné ? Alors si la version du logiciel est plus ancienne que la version de la base (Que fait EF ? Je ne sais pas encore) j'indique qu'il faut mettre à jour le programme car trop vieux et si la base a changée ça peut faire n'importe quoi !
Voilà, je pense que ça peut être un bon début pour toi... C'est assez compliqué au début EF...
Pour une base de données vide mais en cours de dev, il se peut qu'on la détruise, qu'on modifie la struture et qu'on veuille la re-créer :
Add-Migration Version_1 -ProjectName "monprojetDAL" -StartUpProjectName "monprojet"
Dans la classe configuration ajouter :
Add-Migration Version_1 -ProjectName "monProjetDAL" -StartUpProjectName "monProjet" -force
Une dernière chose : pour que le Add-Migration et tout le toutim fonctionne, il faut que le programme compile parce que c'est en le chargeant que le moteur de migration fonctionne.
Or, personnellement, j'ai créé ma chaine de connexion à la main.
Dans ma fonction de récupération de connexion, j'ai donc du code juste pour EF :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| public static DbConnection Connection
{
get
{
if (m_InstanceDbConnection == null)
{
#if DEBUG
Logger.InitLogger("Config\\log4net.config",typeof(DatabaseManagerContext));
Logger.Log.Info("-------------------------------------------------");
Logger.Log.Info(" Démarrage de Entity Framework Migration" );
Logger.Log.Info("-------------------------------------------------");
// !! Attention : TRES IMPORTANT !!
// Pour faire fonctionner Entity Framework Migration, Le gestionnaire de package utilise le
// code source pour détecter les changements en base de données. Pour cela, il instancie la classe de
// contexte qui doit donc OBLIGATOIREMENT pouvoir se connecter lorsqu'elle est instancié sans aucune autre
// initialisation. Ce code ne sert donc qu'à celà et il doit contenir toute la chaine de connexion
// necessaire pour se connecter à la base de données de développement.
m_InstanceDbConnection = new OracleConnection("User Id=gdd; Password=gdd; Data Source=localhost:1521/orcl.168.255.133;Unicode=true;");
#else
throw new Exception("Instance de connexion non initialisée !");
#endif
}
return m_InstanceDbConnection;
}
set
{
m_InstanceDbConnection = value;
}
} |
Bon, je m'arrête là, si tu as besoin de plus d'infos..
Partager