Conflict xảy ra vì cả hai nhánh cùng sửa AppDbContextModelSnapshot.cs — file mô tả trạng thái model sau migration cuối cùng. Nguyên tắc: snapshot phải được sinh lại, không sửa tay.
Phân biệt hai tình huống:
1. Thay đổi độc lập (một người thêm cột Deactivated, người kia thêm LoyaltyPoints): hai migration có thể cùng tồn tại và áp dụng theo thứ tự nào cũng được. Vẫn nên regenerate snapshot cho chắc, nhưng không cần dựng lại migration.
2. Xung đột thật (cả hai cùng đổi tên một property, hoặc cùng đổi kiểu một cột): phải dựng lại migration của mình.
Quy trình chuẩn cho trường hợp 2:
git merge --abort # 1. back to pre-merge state
dotnet ef migrations remove # 2. drop your migration, keep model changes
git merge origin/main # 3. take the teammate's migration
dotnet ef migrations add MyChange # 4. re-add on top of the merged modelSau bước 4, snapshot được sinh lại từ model đã hợp nhất, và hai migration xếp đúng thứ tự.
Giảm tần suất conflict bằng vài thói quen: migration nhỏ và merge sớm; chỉ tạo migration ở nhánh sắp merge; nếu team lớn thì thêm *ModelSnapshot.cs merge=binary trong .gitattributes để git không cố auto-merge và luôn buộc regenerate.