Cách xử lý lỗi There is already an object named TableName in the database khi chạy Update-Database trong Entity Framework Core

Khi sử dụng Entity Framework Core để quản lý database bằng Migration, đôi khi chạy lệnh Update-Database sẽ gặp lỗi:


 

There is already an object named 'TableName' in the database

Lỗi này thường xảy ra khi Migration trong project không khớp với lịch sử Migration đã lưu trong database. Trong bài viết này sẽ giải thích nguyên nhân và cách xử lý triệt để để tiếp tục thêm bảng mới mà không làm ảnh hưởng dữ liệu hiện có.

Nguyên nhân lỗi

Entity Framework Core sử dụng bảng:


 

__EFMigrationsHistory

để lưu lại MigrationId của các migration đã chạy.

Mỗi migration có định dạng:


 

Timestamp_MigrationName

Ví dụ:


 

20260106143220_Initial
20260313025008_Gold

Khi chạy lệnh:


 

Update-Database

EF Core sẽ:

  1. Đọc danh sách migration trong project

  2. So sánh với __EFMigrationsHistory

  3. Chạy những migration chưa tồn tại trong bảng này

Lỗi xảy ra khi:

  • Migration trong database:


 

20260106030539_Initial

  • Migration trong project:


 

20260106143220_Initial

Hai timestamp khác nhau, nên EF nghĩ migration Initial chưa chạy và cố tạo lại các bảng như:


 

AppCategories
AppPosts
AppTags

Trong khi các bảng này đã tồn tại → SQL Server báo lỗi.


Cách kiểm tra

Bước 1: Kiểm tra migration trong database


 

SELECT * FROM __EFMigrationsHistory

Ví dụ kết quả:


 

MigrationId
--------------------------------
20260106030539_Initial


Bước 2: Kiểm tra migration trong project

Trong thư mục:


 

Migrations

có file:


 

20260106143220_Initial.cs
20260313025008_Gold.cs

Có thể thấy timestamp của Initial không giống nhau.


Cách xử lý

Chỉ cần cập nhật lại MigrationId trong bảng __EFMigrationsHistory để khớp với migration trong project.

Chạy SQL:


 

UPDATE __EFMigrationsHistory
SET MigrationId = '20260106143220_Initial'
WHERE MigrationId = '20260106030539_Initial'

Sau khi cập nhật, bảng sẽ trở thành:


 

MigrationId
--------------------------------
20260106143220_Initial


Chạy lại Migration

Sau khi đồng bộ MigrationId, chạy lại:


 

Update-Database

Entity Framework sẽ hiểu rằng:


 

Initial → đã chạy
Gold → chưa chạy

và chỉ chạy migration mới (Gold), ví dụ tạo các bảng:


 

AppGoldProviders
AppGoldTypes
AppGoldPrices


Lưu ý quan trọng

Để tránh lỗi này trong tương lai:

  1. Không xóa hoặc sửa migration đã chạy trên database.

  2. Không tạo lại migration Initial sau khi database đã được tạo.

  3. Khi restore database từ backup, cần đảm bảo bảng __EFMigrationsHistory vẫn tồn tại.

  4. Khi deploy production nên kiểm tra:


 

SELECT * FROM __EFMigrationsHistory


Kết luận

Lỗi “There is already an object named 'TableName' in the database” khi chạy Update-Database thường do Migration trong project không khớp với MigrationId trong database. Chỉ cần đồng bộ lại MigrationId trong bảng __EFMigrationsHistory là có thể tiếp tục sử dụng Migration bình thường mà không cần xóa database hay mất dữ liệu.

0 Phản hồi Viết phản hồi