2016-06-25 1 views
1

En utilisant du code-cadre de l'entité première approact pour insérer des données dans une table par la commande suivante:erreur Obtenir Impossible d'insérer la valeur explicite pour la colonne d'identité dans le tableau « Genres » lorsque IDENTITY_INSERT est réglé sur OFF

public partial class PopulateGenresTable : DbMigration 
    { 
     public override void Up() 
     { 
      Sql("INSERT INTO Genres (Id, Name) VALUES (1, 'Melody')"); 
     } 

     public override void Down() 
     { 
     } 
    } 

Le genre a le code comme:

public class Genre 
    { 
     public int Id { get; set; } 

     [Required] 
     [StringLength(255)] 
     public string Name { get; set; } 
    } 

définie comme: public DbSet<Genre> Genres { get; set; }

Et quand j'ai essayé d'exécuter la commande update-database obtenir le Follo erreur d'aile. Pouvez-vous me dire où je me trompe?

PM> Update-Database 
Value does not fall within the expected range. 
At C:\Projects\GigsHub\packages\EntityFramework.6.1.3\tools\EntityFramework.psm1:977 char:5 
+  $DTE.Solution.SolutionBuild.BuildProject($configuration, $project ... 
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : OperationStopped: (:) [], ArgumentException 
    + FullyQualifiedErrorId : System.ArgumentException 

Value does not fall within the expected range. 
At C:\Projects\GigsHub\packages\EntityFramework.6.1.3\tools\EntityFramework.psm1:977 char:5 
+  $DTE.Solution.SolutionBuild.BuildProject($configuration, $project ... 
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : OperationStopped: (:) [], ArgumentException 
    + FullyQualifiedErrorId : System.ArgumentException 

Specify the '-Verbose' flag to view the SQL statements being applied to the target database. 
Applying explicit migrations: [201606252031479_PopulateGenresTable]. 
Applying explicit migration: 201606252031479_PopulateGenresTable. 
System.Data.SqlClient.SqlException (0x80131904): Cannot insert explicit value for identity column in table 'Genres' when IDENTITY_INSERT is set to OFF. 
    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) 
    at System.Data.SqlClient.SqlInternalConnection.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.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite) 
    at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) 
    at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 
    at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<NonQuery>b__0(DbCommand t, DbCommandInterceptionContext`1 c) 
    at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed) 
    at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand command, DbCommandInterceptionContext interceptionContext) 
    at System.Data.Entity.Internal.InterceptableDbCommand.ExecuteNonQuery() 
    at System.Data.Entity.Migrations.DbMigrator.ExecuteSql(MigrationStatement migrationStatement, DbConnection connection, DbTransaction transaction, DbInterceptionContext interceptionContext) 
    at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(MigrationStatement migrationStatement, DbConnection connection, DbTransaction transaction, DbInterceptionContext interceptionContext) 
    at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbConnection connection, DbTransaction transaction, DbInterceptionContext interceptionContext) 
    at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsWithinTransaction(IEnumerable`1 migrationStatements, DbTransaction transaction, DbInterceptionContext interceptionContext) 
    at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsWithinNewTransaction(IEnumerable`1 migrationStatements, DbConnection connection, DbInterceptionContext interceptionContext) 
    at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbConnection connection, DbInterceptionContext interceptionContext) 
    at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbConnection connection) 
    at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClass30.<ExecuteStatements>b__2e() 
    at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.<>c__DisplayClass1.<Execute>b__0() 
    at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation) 
    at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation) 
    at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements, DbTransaction existingTransaction) 
    at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements) 
    at System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable`1 migrationStatements) 
    at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, VersionedModel targetModel, IEnumerable`1 operations, IEnumerable`1 systemOperations, Boolean downgrading, Boolean auto) 
    at System.Data.Entity.Migrations.DbMigrator.ApplyMigration(DbMigration migration, DbMigration lastMigration) 
    at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ApplyMigration(DbMigration migration, DbMigration lastMigration) 
    at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId) 
    at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId) 
    at System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String targetMigration) 
    at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClassc.<Update>b__b() 
    at System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase) 
    at System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase) 
    at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration) 
    at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration) 
    at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run() 
    at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate) 
    at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate) 
    at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner) 
    at System.Data.Entity.Migrations.Design.ToolingFacade.Update(String targetMigration, Boolean force) 
    at System.Data.Entity.Migrations.UpdateDatabaseCommand.<>c__DisplayClass2.<.ctor>b__0() 
    at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command) 
ClientConnectionId:b8a869e0-e2da-4fcb-8ccb-624307ad7b98 
Error Number:544,State:1,Class:16 
Cannot insert explicit value for identity column in table 'Genres' when IDENTITY_INSERT is set to OFF. 
+1

Semble comme la table dans la base de données est mis en place pour générer automatiquement la valeur de l'attribut 'id' sur l'insertion et ne permet pas une valeur explicite à spécifier. –

+0

Alors, quelles sont les étapes pour résoudre ce problème? La définition de la table ressemble à: 'CREATE TABLE [dbo]. [Genres] ( [ID] IDENTITÉ TINYINT (1, 1) NON NULL, [Nom] NVARCHAR (255) NON NULL, CONSTRAINT [PK_dbo.Genres] PRIMAIRE KEY CLUSTERED ([Id] ASC) ); – adarksun

+1

IDENTITY est un incrément automatique et n'accepte donc pas les valeurs explicites. Supprimez le mot clé et reconstruisez votre base de données ou définissez DatabaseGeneratedOption.Identity sur cette colonne. – DevilSuichiro

Répondre

0

En suivant le cours de Mosh? Moi aussi. J'ai fondamentalement fait ceci:

Sql("SET IDENTITY_INSERT Genres ON"); 
Sql("INSERT INTO Genres (Id,Name) VALUES(1, 'Melody')"); 
Sql("SET IDENTITY_INSERT Genres OFF"); 
Sql("SET IDENTITY_INSERT Genres ON"); 
Sql("INSERT INTO Genres (Id,Name) VALUES(1, 'Melody')"); 
Sql("SET IDENTITY_INSERT Genres OFF"); 
+0

Je viens d'obtenir cette réponse de Mosh: https://twitter.com/moshhamedani/status/762623941303230464 Le problème devrait disparaître si un octet est utilisé à la place de int pour la colonne Id. (oui!) – 8DH

+0

Et qu'en est-il d'autres entités se référant à 'Genre'? Je pense que ce n'est pas la bonne approche d'utiliser un type de données spécifique * seulement * pour éviter la génération d'une colonne d'identité. Voilà ce que sont les cartographies. Rappelez-vous, maintenant il ne peut y avoir plus de 255 genres. –