web-dev-qa-db-fra.com

EF 4.1 Code First et Base de données existante et adhésion .NET

J'ai une base de données appelée ApplicationName_Development s'exécutant sur l'édition SQL Server 2008 R2 Developer sur ma boîte de développement.

J'ai ajouté des tables d'appartenance .NET à la base de données sans aucun problème. Lorsque j'ai essayé de faire fonctionner Code d'abord, j'ai reçu le message d'erreur suivant:

Le serveur a rencontré une erreur lors du traitement de la demande. Le message d'exception est "La compatibilité du modèle ne peut pas être vérifiée car la base de données ne contient pas de métadonnées de modèle. Assurez-vous qu'InclusMetadataConvention a été ajouté aux conventions DbModelBuilder.

Après quelques recherches sur Google, j'ai découvert que je devais supprimer la base de données et laisser EF le créer. C'est bien, mais j'ai perdu toutes mes tables d'appartenance .NET. Je peux revenir en arrière et ajouter à nouveau les tables d'appartenance, mais si mon modèle change et que EF doit recréer la base de données, je dois à nouveau ajouter les tables d'appartenance.

Comment puis-je contourner cela?

15
Mike

J'ai trouvé une solution de contournement plus facile ici. J'espère que ça aide.

http://www.paragm.com/ef-v4-1-code-first-and-asp-net-membership-service/

5
cbrcoder

C'est comme ça que le code fonctionne en premier. L’idée principale du code est d’abord de ne pas toucher votre base de données car il appartient au modèle de créer la base de données. Si vous souhaitez personnaliser votre base de données, vous devez créer une variable IDatabaseInitializer personnalisée et ajouter votre code SQL personnalisé.

public class MyDbInitializer : DropCreateDatabaseIfModelChanges<MyContext>
{
    protected override void Seed(MyContext context)
    {
        // Here run your custom SQL commands
        context.Database.ExecuteSqlCommand("CREATE TABLE ....");
    }
}

Maintenant, il ne vous reste plus qu'à configurer votre intializer au démarrage de votre application:

Database.SetInitializer<MyContext>(new MyDbInitializer());

Si vous ne voulez pas le faire de cette façon, vous devez maintenir manuellement votre base de données et définir initializer sur null.

6
Ladislav Mrnka

Une autre option pourrait être d'utiliser l'espace de noms System.Web.Management. J'ai eu beaucoup de succès avec le code ci-dessous:

string connectionString = ConfigurationManager.ConnectionStrings["MyDatabaseContext"].ConnectionString;
string database = "MyDatabaseName";
SqlServices.Install(database, SqlFeatures.All, connectionString);

Cela créera simplement la base de données et vous pourrez ensuite ajouter des utilisateurs avec l'API d'adhésion standard.

5
wullinkm

Voici une autre possibilité.

Si vous examinez l'exemple MvcMusicStore, il existe une classe SampleData qui est responsable de l'ensemencement de la base de données lors d'une reconstruction. La classe SampleData hérite de DropCreateDatabaseIfModelChanges et remplace la méthode Seed. Cette classe est transmise au Database.SetInitializer dans la méthode Application_Start dans global.asax.

J'avais la même erreur que vous jusqu'à ce que je change la classe parente de SampleData en CreateDatabaseIfNotExist.

Ensuite, vous pouvez remplacer la méthode Seed pour insérer les données de votre choix au démarrage, sans que cela ne détruit la base de données.

3
Phil

Pendant que vous développez, créez 2 bases de données et deux chaînes de connexion. Un pour SqlMembership (en utilisant aspnet_regsql) et un pour votre application EF. Si vous souhaitez les fusionner dans une seule base de données en production, il suffit de changer la chaîne de connexion dans web.config.release pour qu'elle soit identique. Ensuite, les modifications de modèle EF ne feront que déposer votre base de données d'applications et non votre base de données d'adhésion.

En traitant votre composant d'authentification séparément, vous allez naturellement découpler votre système d'authentification de votre système d'application. Ensuite, si vous souhaitez changer de fournisseur d'adhésion, vous serez mieux configuré.

Au fur et à mesure que le système grandit, vous devrez probablement prendre en charge les modèles non purs sans code EF, c'est donc un bon modèle pour emprunter ce chemin.

2
Doug

J'ai trouvé le moyen le plus simple de ne jouer avec rien d'autre.

J'ai exécuté l'application pour la première fois avec DropAndRecreatedatabase toujours dans Initilizer.

Cela a créé ma base de données pour la première fois.

Suite à cela, j'ai changé ceci en DropCreateDatabaseIfModelChanges.

0
Dee