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
- Ngày 13/03/2026 10:04 (GMT+07)
- Ngôn ngữ C#
- bai-viet
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ẽ:
-
Đọc danh sách migration trong project
-
So sánh với
__EFMigrationsHistory -
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:
-
Không xóa hoặc sửa migration đã chạy trên database.
-
Không tạo lại migration
Initialsau khi database đã được tạo. -
Khi restore database từ backup, cần đảm bảo bảng
__EFMigrationsHistoryvẫn tồn tại. -
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