3

J'ai utilisé Entity Framework CTP avec Code-First comme dans this tutorial par Scott Guthrie et un autre par Scott Hanselman (ne peut pas poster le lien, mais google "Simple Code First" avec Entity Framework 4 - Magic Unicorn Feature CTP 4 "). Cela fonctionne parfaitement pour l'application MVC principale, mais j'essaie maintenant d'ajouter un projet de test, qui utilise une base de données SQL CE séparée.Code-Premier Entity Framework - erreur de création SQL CE DB

J'ai ajouté ce qui suit au fichier App.Config:

<connectionStrings> 
    <add name="MyData" 
     connectionString="Data Source=D:\myProject\myDb.sdf;" 
     providerName="System.Data.SqlServerCe.4.0" /> 
</connectionStrings> 

Cependant lorsque je tente d'exécuter les tests qu'il jette l'erreur suivante en essayant de créer la base de données:

test méthode MyProjet.Tests.Administration.ModlelTests.Business.TestGetBusinessesList a jeté exception: System.Reflection.TargetInvocationException: exception a été levée par la cible d'une invocation. ---> System.TypeInitializationException: L'initialiseur de type pour 'System.Data.SqlServerCe.SqlCeProviderServices' a émis une exception. ---> System.Security.VerificationException: opération pourrait déstabiliser l'exécution .

avec la trace de pile suivant:

System.Data.SqlServerCe.SqlCeProviderServices..ctor() System.Data.SqlServerCe.SqlCeProviderServices..cctor() System.RuntimeFieldHandle. GetValue (champ RtFieldInfo , objet exemple, RuntimeType fieldType, RuntimeType DeclaringType, & booléenne domainInitialized) System.Reflection.RtFieldInfo.InternalGetValue (Object obj, Boolean doVisibilityCheck, booléenne doCheckConsistency) System.Reflection.RtFieldInfo.InternalGetValue (Object obj , Boolean doVisibilityCheck) System.Reflection.RtFieldInfo.GetValue (Object obj) System.Data.SqlServerCe.ExtensionMethods.SystemDataSqlServerCeSqlCeProviderServices_Instance_GetValue () System.Data.SqlServerCe.ExtensionMethods.SystemDataSqlServerCeSqlCeProviderServices_Instance() System.Data.SqlServerCe.SqlCeProviderFactory.System.IServiceProvider.GetService (type serviceType) System.Data.Common.DbProviderServices.GetProviderServices (usine DbProviderFactory ) système . Data.Comm on.DbProviderServices.GetProviderServices (connexion DbConnection ) de System.Data.Entity.ModelConfiguration.Internal.Configuration.CodeFirstCachedMetadataWorkspace.GetMetadataWorkspace (DbConnection de storeConnection) System.Data.Entity.Infrastructure.DbModel.CreateObjectContext [TContext] (DbConnection de ExistingConnection) System.Data.Entity.Internal.LazyInternalContext.InitializeFromModel (modèle DbModel ) System.Data.Entity.Internal.LazyInternalContext.InitializeContext() System.Data.Entity.Internal.InternalContext.Initialize() System.Data .Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType (Type entityType) System.Data.Entity.Internal.Linq.EfInternalQuery 1.Initialize() System.Data.Entity.Internal.Linq.EfInternalQuery 1.Include (String path ) System.Data.Entity.Infrastructure.DbQuery`1.Include (chemin cordes ) MyProjet.Areas .Administration.Models.BusinessModel.GetBusinesses() dans D: \ projects2010 \ MyProjet \ MyProjet \ Domaines \ administration \ Modèles \ BusinessModel.cs: ligne 47 MyProjet.Tests.Administration.ModlelTests.Business.TestGetBusinessesList() dans D: \ projects2010 \ MyProjet \ MyProjet.Tests \ Administration \ ModlelTests \ Business.cs: ligne 45

J'ai essayé de remplacer la chaîne de connexion MyData existante dans l'application MVC, et cela fonctionne très bien. Cela provoque uniquement ce problème lorsque cela est ajouté au projet Testing. De plus, le projet de test fonctionne sans problème lorsqu'il pointe vers une base de données SQL ou SQL Express.

Cela fait maintenant un moment que vous vous battez avec ça et vous n'arrivez pas à le comprendre. Je suis sûr que j'ai oublié quelque chose de simple.

+0

'System.Security.VerificationException: l'opération risque de déstabiliser l'environnement d'exécution.» La plupart du temps, cela ne devrait jamais arriver. Cela pourrait être un bug dans le fournisseur. –

+0

Salut Craig, Merci pour votre réponse - Je suppose que je vais juste devoir garder un œil sur les mises à jour. Je posterai si je trouve une solution dans le temps. –

+1

Je suggère de déposer un rapport de connexion pour le bogue, même si le code de @ Jag fonctionne. –

Répondre

4

Essayez d'utiliser

Database.DefaultConnectionFactory = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0");

Voir mon blog pour un exemple http://www.arrangeactassert.com/code-first-entity-framework-unit-test-examples/

+0

Salut Jag, Merci pour le conseil, j'avais essayé d'utiliser SqlCeConnectionFactory ("System.Data.SqlServerCe.4.0"); mais je ne pourrais pas l'avoir utilisé correctement. Je vais regarder votre tutoriel aujourd'hui et voir si je peux le faire fonctionner. –

+0

J'ai jeté un coup d'oeil à votre tutoriel - c'est génial, je devrai passer en revue le tout plus tard. Malheureusement, je reçois toujours l'exception. J'ai testé votre code dans un certain nombre d'autres projets et cela fonctionne parfaitement - juste dans mon projet de test d'unité. J'utilise le framework de test de Microsoft plutôt que NUnit - je vais vérifier pour voir si cela cause un conflit. Publiera si je trouve la réponse. Merci encore - le tutoriel est super. –

+0

J'ai ajouté la ligne à Global.asax.cs dans Application_Start, puis tout a fonctionné. J'avais un problème où il ne pouvait pas trouver l'instance. – kamranicus

0

Je dirige les essais dans le cadre du cadre intégré de test Microsoft. Changer le framework de test en NUnit (comme dans le tutoriel de Jag) a résolu le problème.

Il semble qu'il y ait un conflit entre SqlServerCe et Visual Studio Unit Testing Framework.

Questions connexes