인프런 커뮤니티 질문&답변

Justin님의 프로필 이미지

작성한 질문수

Razor Pages 멤버십 서비스 초급과정(.NET5)

Migration 작업

update-database 에러

작성

·

327

0

안녕하세요. 지난번 주신 답변도 감사합니다.  Migration 중에 에러가 났는데, 도움 부탁드립니다. 우선 상황을 설명드리면

1) .net Core 3.1 / Azure Web App / VS 2019 구요, 

2) 이 강의를 접하기 전에 이미 Identity 폴더에 스캐폴딩을 한 상태

3) add-migration 까지는 잘 됐으나 update-database 중 오류 발생

4) DB에서 확인해 보면 AspNetUserClaims, AspNetUsers 등 7개의 테이블 생성되어 있음 

코드도 GitHub에서 복붙이라 오타는 없을 거 같은데...(빌드 잘됨) 무엇이 문제인지, 어떻게 해결할 수 있는지 도움 부탁드립니다. 

감사합니다 !!!

에러 메시지

fail: Microsoft.EntityFrameworkCore.Database.Command[20102]

      Failed executing DbCommand (162ms) [Parameters=[], CommandType='Text', CommandTimeout='30']

      ALTER TABLE [MemberClaim] ADD CONSTRAINT [FK_MemberClaim_AspNetUsers_UserId] FOREIGN KEY ([UserId]) REFERENCES [AspNetUsers] ([Id]) ON DELETE CASCADE;

Failed executing DbCommand (162ms) [Parameters=[], CommandType='Text', CommandTimeout='30']

ALTER TABLE [MemberClaim] ADD CONSTRAINT [FK_MemberClaim_AspNetUsers_UserId] FOREIGN KEY ([UserId]) REFERENCES [AspNetUsers] ([Id]) ON DELETE CASCADE;

Microsoft.Data.SqlClient.SqlException (0x80131904): Column 'AspNetUsers.Id' is not the same data type as referencing column 'MemberClaim.UserId' in foreign key 'FK_MemberClaim_AspNetUsers_UserId'.

Could not create constraint or index. See previous errors.

   at Microsoft.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)

   at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)

   at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)

   at Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)

   at Microsoft.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean isAsync, Int32 timeout, Boolean asyncWrite)

   at Microsoft.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, Boolean sendToPipe, Int32 timeout, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry, String methodName)

   at Microsoft.Data.SqlClient.SqlCommand.ExecuteNonQuery()

   at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteNonQuery(RelationalCommandParameterObject parameterObject)

   at Microsoft.EntityFrameworkCore.Migrations.MigrationCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues)

   at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable`1 migrationCommands, IRelationalConnection connection)

   at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)

   at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration, String contextType)

   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabaseImpl(String targetMigration, String contextType)

   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_0.<.ctor>b__0()

   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)

ClientConnectionId:5d19c800-22e0-4007-920e-9450a07f3836

Error Number:1778,State:0,Class:16

Column 'AspNetUsers.Id' is not the same data type as referencing column 'MemberClaim.UserId' in foreign key 'FK_MemberClaim_AspNetUsers_UserId'.

Could not create constraint or index. See previous errors.

답변 5

1

김정수님의 프로필 이미지
김정수
지식공유자

잘 되셨다니 다행입니다.

진행하다가 막히면 또 문의해 주세요.

추위에 건강 유의하세요.

0

Justin님의 프로필 이미지
Justin
질문자

강사님 해결됐습니다. GitHub 코드랑 제걸 하나하나 비교하다 보니,  ApplicationDbContext 상단에 IdentityDbContext<ApplicationUser, ApplicationRole, string> 를 빼 먹고 그냥 IdentityDbContext 로만 되어 있었더라구요, string 을 받아오지 않아서 에러가 났던거 같아요. 감사합니다 !!! 이제 이후 강의 따라하러 가 볼게요~ 좋은 하루 되세요.

0

김정수님의 프로필 이미지
김정수
지식공유자

서면으로는 더 이상 해결이

어려울 듯 싶습니다.

먼저, 대화가능한 시간대를 알려주세요. (예: 저녁 9시)

그 때, 서면 대신 원격접속으로 도와드리겠습니다.

팀뷰어 먼저 설치하고 실행하신 후에 말씀해 주세요.

팀뷰어는 https://www.teamviewer.com/ko/에서

다운로드 받으시면 됩니다.

설치할 때는 개인목적으로 설치 2번째 항목을 선택해서

설치해 주세요. (상업적으로 사용하면 유료입니다.)

0

Justin님의 프로필 이미지
Justin
질문자

강사님 안녕하세요. 

말씀해 주신대로 (1) Database에서 AspNet 으로 시작하는 모든 테이블과 __EFMigration~ 테이블까지 모두 지우고 (2) VS에서 Migrations 폴더를 지운 후에 (3) Add-Migration 까지는 정상적으로 진행됐습니다.  그리고 (4) update-database 를 하자 동일한 에러가 아래와 같이 나옵니다.  참고로 GitHub 에 있는 모든 코드를 그대로 가져 온 것이 아니라 현재 ApplicationUser, ApplicationRole, ApplicationDbContext 만 코딩을 한 상태입니다. Migration까지 잘 되면 SeedSite 를 하려고 했거든요. 

그럼 한번 만 더 살펴봐 주세요. 감사합니다 !!!!

Failed executing DbCommand (18ms) [Parameters=[], CommandType='Text', CommandTimeout='30']

CREATE TABLE [MemberClaim] (

    [UserSeq] int NOT NULL IDENTITY,

    [UserId] varchar(50) NOT NULL,

    [ClaimType] varchar(100) NULL,

    [ClaimValue] nvarchar(100) NULL,

    CONSTRAINT [PK_MemberClaim] PRIMARY KEY ([UserSeq]),

    CONSTRAINT [FK_MemberClaim_AspNetUsers_UserId] FOREIGN KEY ([UserId]) REFERENCES [AspNetUsers] ([Id]) ON DELETE CASCADE,

    CONSTRAINT [FK_MemberClaim_Member_UserId] FOREIGN KEY ([UserId]) REFERENCES [Member] ([UserId]) ON DELETE CASCADE

Microsoft.Data.SqlClient.SqlException (0x80131904): Column 'AspNetUsers.Id' is not the same data type as referencing column 'MemberClaim.UserId' in foreign key 'FK_MemberClaim_AspNetUsers_UserId'.

Could not create constraint or index. See previous errors.

Column 'AspNetUsers.Id' is not the same data type as referencing column 'MemberClaim.UserId' in foreign key 'FK_MemberClaim_AspNetUsers_UserId'.

Could not create constraint or index. See previous errors.

0

김정수님의 프로필 이미지
김정수
지식공유자

① 먼저, 열강해 주셔서 감사합니다.

Justin님께서 언급하신 대로,

이미 Identity 폴더에 스캐폴딩을 한 상태일 경우에

데이터베이스에 이미 만들어진 모든 테이블을 삭제하는

방법 밖에 없습니다.

② 문의하신 에러 메시지를 보면, 아래 문구가 눈에 띕니다.

-----------------------------------------------------

Column 'AspNetUsers.Id' is not the same data type

as referencing column 'MemberClaim.UserId'

in foreign key 'FK_MemberClaim_AspNetUsers_UserId'.

-----------------------------------------------------

③ 에러를 살펴보면,

AspNetUsers 테이블의 Id는 nvarchar(450) 데이터 타입이고

MemberClaim 테이블의 UserId는 varchar(50) 데이터 타입이라

Foreign Key(FK)로 연결할 수 없어서 에러가 난 것입니다.

④ 다음의 표에서 데이터 타입이 다른 것을 확인하실 수 있습니다.

--------------------------------------------------------

커스터마이징 전             |     커스터마이징 후

AspNetUsers : Id                 Member : UserId

             nvarchar(450)                varchar(50)

AspNetUserClaims : UserId        MemberClaim : UserId

             nvarchar(450)                varchar(50)

--------------------------------------------------------

⑤ 위의 표를 보면서, 어떻게 커스터마이징 전과 후의 테이블들로

연결이 될 수 있는지 의아할 수 있습니다만,

위에 나온 것은 클래스를 마이그레이션해서 생성되는 테이블명이

다를 뿐입니다. 클래스를 살펴보면,

IdentityUserClaim과 ApplicationUser가

Foreign Key(FK)로 연결되어 있습니다.

(커스터마이징을 하지 않아도 두 클래스는 FK로 연결된 테이블 두 개를

생성하는 것이죠. 내부적으로요.)

설명이 좀 길었는데, 이해가 되셨는지요?

⑥ 이제 해결해야 할 시간입니다.

해결방법은 간단합니다.

먼저, 데이터베이스에서 AspNet 접두어로 된 7개의 테이블을 수동으로 삭제하세요.

(__EFMigrationsHistory 테이블도 같이 삭제하세요.)

그리고 NetCore.Web 프로젝트에서

"/Data/Migrations/20200730031805_SeedSiteRole.cs" 파일을 삭제해 주세요.

그냥 삭제하지 마시고, 반드시 Package Manager Console 창에서

remove-migration 명령어를 통해 삭제하셔야 합니다.

그 다음에 update-database를 하시면,

20200724043036_Create_Identity.cs 내용이 데이터베이스에 적용됩니다.

마지막으로 SeedSiteRole.cs 또한 데이터베이스에 적용해야

멤버십 서비스가 이상없이 잘 동작하겠죠?

이렇게 하시면 문제없이 해결이 잘 되실 것입니다.

⑦ 또 문제가 발생하면 언제든지 질문해 주시고, 즐강하세요.

Justin님의 프로필 이미지

작성한 질문수

질문하기