2016-06-25 2 views
1

다음 명령하여 테이블에 데이터를 삽입하는 엔티티 프레임 워크 코드를 먼저 approact를 사용하도록 설정하면 테이블에 식별 C 럼에 '장르'를 명시 적 값을 삽입 할 수 없습니다 오류를 가져 오기 :IDENTITY_INSERT가 OFF

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

     public override void Down() 
     { 
     } 
    } 

장르가있다 같은 코드 :

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

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

는 다음과 같이 정의 : public DbSet<Genre> Genres { get; set; }

그리고 나는 FOLLO을 받고 명령 update-database을 실행하려고 할 때 날개 오류. 내가 잘못하고있는 곳을 말해 줄 수 있니?

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

데이터베이스의 테이블과 같은 사운드는 삽입시 id 속성의 값을 자동으로 생성하도록 설정되며 명시 적 값을 지정할 수 없습니다. –

+0

그래서이 문제를 해결하기위한 단계는 무엇입니까? 테이블 정의는 다음과 같습니다. 'CREATE TABLE [dbo]. [Genres] ( [ID] TINYINT IDENTITY (1, 1) NOT NULL, [이름] NVARCHAR (255) NOT NULL, CONSTRAINT [PK_dbo.Genres] PRIMARY KEY CLUSTERED ([ID] ASC) ); ' – adarksun

+1

IDENTITY는 자동 증가이므로 명시적인 값을 허용하지 않습니다. 키워드를 제거하고 데이터베이스를 다시 빌드하거나이 열에 DatabaseGeneratedOption.Identity를 설정하십시오. – DevilSuichiro

답변

0

다음의 Mosh 과정을 따르시겠습니까? 나도. 기본적으로이 작업을 수행했습니다 :

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

방금 ​​Mosh의 대답을 얻었습니다. https://twitter.com/moshhamedani/status/762623941303230464 ID 열에 int 대신 byte가 사용되면 문제가 해결됩니다. (예!) – 8DH

+0

그리고 '장르'를 말하는 다른 엔티티는 어떻습니까? 나는 식별 컬럼이 생성되는 것을 피하기 위해 특정 데이터 타입 *만을 사용하는 것이 올바른 접근법이 아니라고 생각합니다. 그게 매핑이되는 것입니다. 지금 장르가 255 개를 넘을 수는 없습니다. –