2011-05-10 5 views
7

J'ai cherché cette erreur étrange pendant des heures mais je n'ai rien trouvé. J'ai une entité très simple:Entity Framework code d'abord: mise à jour SetInitializer throws exception

public class Company { 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
} 

Et voici le contexte:

public class MyDBContext : DbContext { 

    public DbSet<Company> Companies { get; set; } 

} 

Lors de l'exécution de la première fois, tout fonctionne très bien. Mais, quand je change l'entité (par exemple, je mets l'attribut [Key] pour l'identification), j'obtiens le "modèle a changé" prévu ou quelque chose d'erreur. Donc, je l'entre dans le Global.asax application_start:

Database.SetInitializer<MyDBContext> 
(new DropCreateDatabaseIfModelChanges<MyDBContext>()); 

C'est où je suis coincé. Il n'y a pas d'erreur de compilation, il compile sans erreurs/avertissements. Mais, lorsque j'exécute mon projet, j'obtiens l'erreur suivante:

Description: Une exception non gérée s'est produite lors de l'exécution de la requête Web en cours. Veuillez consulter la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code.

Détails d'exception: System.TypeLoadException: GenericArguments[0], 'MyDB.Data.MyDBContext', on 'System.Data.Entity.IDatabaseInitializer1[TContext]' violates the constraint of type parameter 'TContext'.

S'il vous plaît, quelqu'un a une idée? J'utilise Entity Framework 4.1 (CTP5)

+0

J'ai finalement compris. Mon contexte de base de données était dans un projet de bibliothèque de classes, tandis que le Global.asax était bien sûr dans une application web MVC3. Déplacer la logique de base de données entière vers la même application Web MVC3 a résolu le problème. Alors pourquoi ça ne marche pas dans la bibliothèque de classe? – user825887

+3

F * ck ceci, résolu après des heures. Il s'est avéré que la classe de bibliothèque utilisait 4.0.0 et l'application Web 4.0.1. Tirez-moi. – user825887

+3

Monsieur, vous venez de me sauver des heures garanties de me taper la tête contre un bureau. Mettez votre réponse en place et je vais l'augmenter immédiatement. – Andrey

Répondre

2

Pour les chalutiers de questions sans réponse, cela a été répondu ci-dessus. Mais jamais marqué par les utilisateurs. Voir les commentaires ci-dessus. Plus de 1K vues! C'est perdre beaucoup de temps ... Alors j'ai ajouté ceci.

0

Si vous travaillez avec Web.config (au lieu de Global.asax) et plusieurs fichiers de projet (par exemple, je crée par exemple dans ASP.NET MVC un [Projectname] .WebUI qui contient les fichiers MVC et un [ Projectname] .domaine qui est une bibliothèque de classes contenant la logique de données), vous devez ajouter du code ci-dessous pour TOUS Web.config/App.config dans votre solution:

<configSections> 
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
</configSections> 

Cela a fonctionné pour moi sans avoir besoin de fusionner mon projet de domaine avec le projet WebUI.

Questions connexes