Entity Framework Code Première table de création automatique

J'essaie de comprendre ce que Entity Framework fait dans le monde sous le capot qui provoque le comportement observé que je vais décrire.

Ceci est un projet d'application Internet ASP.NET MVC 4.

J'ai une database MSSQL existante sur localhost appelée wpdb .

Web.config:

 <add name="DefaultConnection" connectionSsortingng="Data Source=localhost;Initial Catalog=wpdb;User=xxx;Password=xxx" providerName="System.Data.SqlClient" /> 

Lorsque je lance l'application Web pour la première fois, elle crée dbo.UserProfile , dbo.webpages_Membership et quelques autres tables.

Je crée un nouveau model Comments.cs

 public class Comment { public int ID { get; set; } public ssortingng Text { get; set; } } public class CommentDBContext : DbContext { public DbSet<Comment> Comments { get; set; } } 

J'ajoute un nouveau controller CommentsController tant que controller MVC avec des actions de lecture / écriture et des vues, en utilisant Entity Framework (et select mes classs "Comment" et "CommentDBContext").

Ensuite, j'ajoute une nouvelle string de connection (apparemment la string de connection par défaut d'Entity Framework n'est pas "DefaultConnection" mais quelque chose qui finit par être invalide, je ne sais pas pourquoi).

 <add name="CommentDbContext" connectionSsortingng="Data Source=localhost;Initial Catalog=wpdb;User=xxx;Password=xxx" providerName="System.Data.SqlClient" /> 

Maintenant, lorsque je navigue vers localhost/Comments Entity Framework crée automatiquement une nouvelle table dans ma database appelée dbo.Comments .

Tout ce que j'ai décrit jusqu'ici est exactement comme prévu, voici où ça devient bizarre

J'ai accidentellement supprimé dbo.Comments . Cependant, cette fois, lorsque je navigue vers localhost/Comments Entity Framework ne recréera pas la table. Au lieu de cela, une erreur "Invalid object 'dbo.Comments'" s'affiche.

Pourquoi fait-il cela? Pourquoi ne recréerait-il pas simplement la database? J'ai même essayé de supprimer tout mon code Model / Controller / View, de nettoyer / rebuild la solution, puis de recréer le tout, et EF refuse toujours de recréer la table!

Ce qui est encore plus déroutant, si je commente la ligne CommentDbContext dans mon file Web.config (pour que le code EF tente de se connecter à la mauvaise database), exécutez l'application et naviguez vers /Comments , puis tuez l'application, décommentez le string de connection, cette fois, il crée une toute nouvelle table dbo.Comments sans aucun problème!

Pourquoi le fait de changer de string de connection à quelque chose d'invalide puis de la changer de nouveau permet à EF de générer une table à partir de mes templates? Il semble y avoir un état préservé quelque part qu'il ne devrait pas être ..

J'ai accidentellement supprimé dbo.Comments. il me jette une erreur "Objet invalide 'dbo.Comments'". Pourquoi fait-il cela?

Parce que vous n'êtes pas supposé éditer / supprimer la table comme vous l'avez configuré. Il ne synchronise pas automatiquement les modifications de la database avec les templates et les templates de la database.

Pourquoi ne recréerait-il pas simplement la database?

Parce que vous ne l'avez pas dit automatiquement, et vous ne l'avez pas non plus demandé.

Pourquoi le fait de changer de string de connection à quelque chose d'invalide puis de la changer de nouveau permet à EF de générer une table à partir de mes templates?

Parce qu'il crée une table (a oublié le nom) qui connaît la dernière fois qu'il a synchronisé et quelles tables il a et n'a pas créé. Lorsque vous modifiez la string de connection à une database différente qui n'a pas la table, elle recrée tout.

Vous devriez probablement jeter un coup d'œil aux articles suivants sur MSDN et choisir comment vous voulez que Entity Framework fonctionne pour votre scénario:

Code Premières migrations