2010-12-09 76 views
4

J'ai créé une table de test simple dans un fichier EDMX. La table s'appelle Test avec une colonne, TestId. TestId est la clé d'entité, et son type est Guid. StoreGeneratedPattern est défini sur Identity (par défaut).Entity Framework et exceptions de référence null MySQL lors de l'insertion d'une ligne

Le SQL généré ressemble à ceci:

CREATE TABLE `Tests` (
    `TestId` CHAR(36) BINARY NOT NULL 
); 

ALTER TABLE `Tests` 
ADD CONSTRAINT `PK_Tests` 
    PRIMARY KEY (`TestId`); 

maintenant le corps de mon code ressemble à ceci:

 using (var foo = new TestModelContainer()) 
     { 
      var test = new Test() { 
       TestId = Guid.NewGuid() 
      }; 

      foo.Tests.AddObject(test); 
      foo.SaveChanges(); 
     } 

Je reçois une exception de référence null quand je SaveChanges. La trace de la pile va profondément dans les tripes du connecteur MySql (j'utilise la version 6.3.5):

System.NullReferenceException was unhandled 
    Message=Object reference not set to an instance of an object. 
    Source=MySql.Data.Entity 
    StackTrace: 
     at MySql.Data.Entity.SqlGenerator.GenerateReturningSql(DbModificationCommandTree tree, DbExpression returning) 
     at MySql.Data.Entity.InsertGenerator.GenerateSQL(DbCommandTree tree) 
     at MySql.Data.MySqlClient.MySqlProviderServices.CreateDbCommandDefinition(DbProviderManifest providerManifest, DbCommandTree commandTree) 
     at System.Data.Common.DbProviderServices.CreateCommandDefinition(DbCommandTree commandTree) 
     at System.Data.Common.DbProviderServices.CreateCommand(DbCommandTree commandTree) 
     at System.Data.Mapping.Update.Internal.UpdateTranslator.CreateCommand(DbModificationCommandTree commandTree) 
     at System.Data.Mapping.Update.Internal.DynamicUpdateCommand.CreateCommand(UpdateTranslator translator, Dictionary`2 identifierValues) 
     at System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator translator, EntityConnection connection, Dictionary`2 identifierValues, List`1 generatedValues) 
     at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter) 
     at System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache) 
     at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options) 
     at System.Data.Objects.ObjectContext.SaveChanges() 
     at EFMySQL.Program.Main(String[] args) in C:\Users\david.pio\Documents\Visual Studio 2010\Projects\EFMySQL\EFMySQL\Program.cs:line 40 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 

Des idées?

Répondre

3

Résolu ma propre question

Dans le concepteur EDMX il y a une propriété appelée StoreGeneratedPattern. Pour EntityKey est défini sur Identity. Comme je génère mes clés primaires dans le code de l'application ne reposant pas sur la base de données, je sais que je ne veux pas ... cependant quand le script DDL est généré, il n'y a rien dans le script de création de table qui impose l'identité. C'était correct.

Lorsque j'ai changé la valeur de Identité à Aucun, cela fonctionne ... go figure