강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của sungvin8900
sungvin8900

câu hỏi đã được viết

Khóa học dành cho người mới bắt đầu về dịch vụ thành viên của Razor Pages (.NET5)

Migration

update-database 에러

Viết

·

480

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.

.NET

Câu trả lời 5

1

dotnet님의 프로필 이미지
dotnet
Người chia sẻ kiến thức

잘 되셨다니 다행입니다.

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

추위에 건강 유의하세요.

0

Justin님의 프로필 이미지
Justin
Người đặt câu hỏi

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

0

dotnet님의 프로필 이미지
dotnet
Người chia sẻ kiến thức

서면으로는 더 이상 해결이

어려울 듯 싶습니다.

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

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

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

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

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

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

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

0

Justin님의 프로필 이미지
Justin
Người đặt câu hỏi

강사님 안녕하세요. 

말씀해 주신대로 (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

dotnet님의 프로필 이미지
dotnet
Người chia sẻ kiến thức

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

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 또한 데이터베이스에 적용해야

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

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

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

Hình ảnh hồ sơ của sungvin8900
sungvin8900

câu hỏi đã được viết

Đặt câu hỏi