작성
·
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
강사님 해결됐습니다. GitHub 코드랑 제걸 하나하나 비교하다 보니, ApplicationDbContext 상단에 IdentityDbContext<ApplicationUser, ApplicationRole, string> 를 빼 먹고 그냥 IdentityDbContext 로만 되어 있었더라구요, string 을 받아오지 않아서 에러가 났던거 같아요. 감사합니다 !!! 이제 이후 강의 따라하러 가 볼게요~ 좋은 하루 되세요.
0
서면으로는 더 이상 해결이
어려울 듯 싶습니다.
먼저, 대화가능한 시간대를 알려주세요. (예: 저녁 9시)
그 때, 서면 대신 원격접속으로 도와드리겠습니다.
팀뷰어 먼저 설치하고 실행하신 후에 말씀해 주세요.
팀뷰어는 https://www.teamviewer.com/ko/에서
다운로드 받으시면 됩니다.
설치할 때는 개인목적으로 설치 2번째 항목을 선택해서
설치해 주세요. (상업적으로 사용하면 유료입니다.)
0
강사님 안녕하세요.
말씀해 주신대로 (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 또한 데이터베이스에 적용해야
멤버십 서비스가 이상없이 잘 동작하겠죠?
이렇게 하시면 문제없이 해결이 잘 되실 것입니다.
⑦ 또 문제가 발생하면 언제든지 질문해 주시고, 즐강하세요.