2017-03-02 3 views
0

Lorsque j'exécute mon DbInitializer, une erreur est affichée par "context.SaveChanges", elle indique "Exception de type 'Microsoft.EntityFrameworkCore.DbUpdateException' s'est produit dans Microsoft.EntityFrameworkCore.dll mais n'a pas été manipulé dans le code d'utilisateur "Une erreur "DbUpdateException n'a pas été gérée par le code utilisateur" lors de l'exécution du code

J'ai téléchargé plusieurs paquets NuGet différents et toujours l'erreur est toujours là. Des idées ?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using Microsoft.EntityFrameworkCore; 
using Microsoft.Extensions.DependencyInjection; 
using FinalTeamProject.Data; 

namespace FinalTeamProject.Models 
{ 
public static class DbInitializer 
{ 
    public static void Initialize(BookingContext context) 
    { 
     context.Database.EnsureCreated(); 

     // Look for any students. 
     if (context.Customers.Any()) 
     { 
      return; // DB has been seeded 
     } 

     var customers = new Customer[] 
     { 
     new Customer{ID=201,FirstName="Joe",LastName="Gatto",Telephone="07580043213"}, 
     new Customer{ID=202,FirstName="Sal",LastName="Vulcano",Telephone="0758243454"}, 
     new Customer{ID=203,FirstName="James",LastName="Murray",Telephone="07580043290"}, 
     new Customer{ID=204,FirstName="Brian",LastName="Quinn",Telephone="075800432800"}, 
     new Customer{ID=205,FirstName="Joe",LastName="Gato",Telephone="0758004313"}, 
     new Customer{ID=206,FirstName="Sal",LastName="Vulcno",Telephone="075823454"}, 
     new Customer{ID=207,FirstName="James",LastName="Muray",Telephone="0750043290"}, 
     new Customer{ID=208,FirstName="Brian",LastName="Quin",Telephone="07500432800"} 

     }; 
     foreach (Customer s in customers) 
     { 
      context.Customers.Add(s); 
     } 
     context.SaveChanges(); 

L'Exception interne:

{System.Data.SqlClient.SqlException: Cannot insert explicit value for identity column in table 'Customer' when IDENTITY_INSERT is set to OFF. 
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) 
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) 
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) 
at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() 
at System.Data.SqlClient.SqlDataReader.get_MetaData() 
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) 
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds) 
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior) 
at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, String executeMethod, IReadOnlyDictionary`2 parameterValues, Boolean closeConnection) 
at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteReader(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues) 
at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection connection) 
ClientConnectionId:a4073037-3f12-4a01-9019-ab632c3325a0 
Error Number:544,State:1,Class:16} 
+1

Il devrait y avoir une InnerException, merci de l'envoyer aussi. Vérifiez également si la classe 'Customer' a des champs obligatoires que vous ne semez pas. –

+1

utiliser 'try-catch' pour obtenir l'exception, définir un point d'arrêt dans le' catch' et inspecter les détails de l'exception pour obtenir plus d'informations sur l'erreur. Une fois cela fait, vous pouvez mettre à jour la question avec plus de détails qui seraient utiles pour vous aider. – bradbury9

Répondre

2

colonne Customer.Id marqué comme colonne identité dans la base de données. Vous ne pouvez pas définir de valeur pour une telle colonne explicitement. Vous définissez la valeur de la propriété Customer.ID. C'est pourquoi vous voyez cette exception.

La valeur de la colonne IDENTITY est affectée au serveur SQL lors de l'insertion de l'enregistrement dans la table.

Vous avez donc les solutions suivantes.

Un - Supprimer la contrainte IDENTITY de la colonne dans la base de données. De cette façon, votre code actuel fonctionnera correctement.

Deux - Vous n'êtes pas attribué des valeurs à la propriété Customer.ID

var customers = new Customer[] 
{ 
    new Customer{FirstName="Joe",LastName="Gatto",Telephone="07580043213"}, 
    new Customer{FirstName="Sal",LastName="Vulcano",Telephone="0758243454"}, 
    new Customer{FirstName="James",LastName="Murray",Telephone="07580043290"} 
}; 
foreach (Customer s in customers) 
{ 
    context.Customers.Add(s); 
} 
context.SaveChanges(); 

Trois - Vous attribuez la valeur à la propriété Customer.ID mais vous devez régler la indentity_insert ON sur la table avant d'insérer la lignes avec des identifiants explicites, puis définissez si OFF après l'insertion.

var customers = new Customer[] 
{ 
    new Customer{ID=201,FirstName="Joe",LastName="Gatto",Telephone="07580043213"}, 
    new Customer{ID=202,FirstName="Sal",LastName="Vulcano",Telephone="0758243454"}, 
    new Customer{ID=203,FirstName="James",LastName="Murray",Telephone="07580043290"} 
}; 

context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT Customer ON") 

foreach (Customer s in customers) 
{ 
    context.Customers.Add(s); 
} 

context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT Customer OFF") 

le problème avec le 1er et 3e approche est que vous devez garder une trace de la dernière ID Inséré pour le client afin que vous ne recevez pas l'erreur de violation de clé primaire lorsque vous essayez d'insérer le client suivant.

Pour la colonne IDENTITY, il est préférable de laisser au serveur SQL le soin de générer les valeurs correspondantes.

0

Vous avez l'explication à votre exception interne

{System.Data.SqlClient.SqlException: Impossible d'insérer la valeur explicite pour la colonne d'identité dans le tableau 'Client' lorsque IDENTITY_INSERT est défini sur OFF.

Veuillez activer le IDENTITY_INSERT dans la base de données ou supprimer l'ID à partir des données que vous insérez (la base de données se chargera de le générer)