-
Notifications
You must be signed in to change notification settings - Fork 3.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Rowversion migration regression from EF Core 8 to 9 #35148
Comments
@Moerup I have not been able to reproduce this. Please attach a small, runnable project or post a small, runnable code listing that contains a full model in code that produces the initial migration and then specifically how to change that model to reproduce the migration that you are seeing. |
@ajcvickers Have you tried testing it with a table using temporal tables? I sadly don't currently have the resources in the project to spend time on a standalone reproduction of the issues, would love to do it, but the money guys says no, as is tradition 😄 |
@ajcvickers I'm not 100% sure, but my repro from the other ticket may help here also. The issue there is a migration created by EFCore 8 that is then applied by EFCore 9. In that case, we have unit tests that recreate the database using migrations. These tests fail when switching to EFCore 9, running EFCore 8-generated migration for a temporal table. I suspect similar in this case, and can try to fork the repository to prove it out. In general:
|
Full repro of this error. It's worth noting I could not get it to repro if I just had RowVersion migration. The issue is a combination of RowVersion+TemporalTable migrations generated from EFCore8, when run by EFCore9 causes the error "Cannot alter column 'RowVersion' to be data type timestamp". This is a different error from the other ticket, but I suspect being caused by the same area of EFCore9 code. I suspect these changes, but haven't dove into the EFCore code to try to figure out further. In our case, the related issue is blocking EFCore9 adoption. Possible workarounds include modifying the migration cs somehow or complete reset of migrations. |
Thanks a lot @danroot for taking the time to make repros of not only 1, but 2 of my created issues! |
In 9 we changed the way we process migration of temporal tables. One of the changes was drastically reducing the number of annotations for columns which are part of temporal tables. This however caused regressions for cases where migration code was created using EF8 (and containing those legacy annotations) but then executed using EF9 tooling. Specifically, extra annotations were generating a number of superfluous Alter Column operations (which were only modifying those annotations). In EF8 we had logic to weed out those operations, but it was removed in EF9. Fix is to remove all the legacy annotations on column operations before we start processing them. We no longer rely on them, but rather use annotations on Table operations and/or relational model. The only exception is CreateColumnOperation, so for it we convert old annotations to TemporalIsPeriodStartColumn and TemporalIsPeriodEndColumn where appropriate. Also, we are bringing back logic from EF8 which removed unnecessary AlterColumnOperations if the old and new columns are the same after the legacy temporal annotations have been removed. Also fixes #35148 which was the same underlying issue.
In 9 we changed the way we process migration of temporal tables. One of the changes was drastically reducing the number of annotations for columns which are part of temporal tables. This however caused regressions for cases where migration code was created using EF8 (and containing those legacy annotations) but then executed using EF9 tooling. Specifically, extra annotations were generating a number of superfluous Alter Column operations (which were only modifying those annotations). In EF8 we had logic to weed out those operations, but it was removed in EF9. Fix is to remove all the legacy annotations on column operations before we start processing them. We no longer rely on them, but rather use annotations on Table operations and/or relational model. The only exception is CreateColumnOperation, so for it we convert old annotations to TemporalIsPeriodStartColumn and TemporalIsPeriodEndColumn where appropriate. Also, we are bringing back logic from EF8 which removed unnecessary AlterColumnOperations if the old and new columns are the same after the legacy temporal annotations have been removed. Fixes #35108 Also fixes #35148 which was the same underlying issue.
In 9 we changed the way we process migration of temporal tables. One of the changes was drastically reducing the number of annotations for columns which are part of temporal tables. This however caused regressions for cases where migration code was created using EF8 (and containing those legacy annotations) but then executed using EF9 tooling. Specifically, extra annotations were generating a number of superfluous Alter Column operations (which were only modifying those annotations). In EF8 we had logic to weed out those operations, but it was removed in EF9. Fix is to remove all the legacy annotations on column operations before we start processing them. We no longer rely on them, but rather use annotations on Table operations and/or relational model. The only exception is CreateColumnOperation, so for it we convert old annotations to TemporalIsPeriodStartColumn and TemporalIsPeriodEndColumn where appropriate. Also, we are bringing back logic from EF8 which removed unnecessary AlterColumnOperations if the old and new columns are the same after the legacy temporal annotations have been removed. Fixes #35108 Also fixes #35148 which was the same underlying issue.
Thanks for the legwok @danroot, this regression hit my project too as I was updating to .NET 9. I have the exact situation where my solution originally did not have temporal tables applied to entities but they were added later. Now my CI pipeline fails with the error about
Pretty tricky and will prevent this update from going to production. So does a fix look to be heading for 9.0.2? |
Yes, my understanding is this is fixed for 9.0.2 in #35289 If you need fix before that, @maumar 's fix here works.. I even looked into writing a script to fixup ours in the way he suggests (we have dozens of migrations with this issue), but couldn't quite get a script I was comfortable with. An alternative, IF you don't have to support any old-version databases, would be to squash migrations. and start over. That makes most sense in like an enterprise environment where you know all dev, test, and production instances of the db are up-to-date. |
Rowversion migration regression from EF Core 8 to 9
I'm in the process of upgrading an application from .NET 8 to 9.
But I'm running into problems when trying to run existing migrations that have been created with EF Core 8 and working for over a year now on multiple versions of EF Core (8.0.4 to 8.0.11)
I have a migration that throws exceptions and can't complete at all on v9.0.0, but if I revert to 8.0.11 it works fine.
Include your code
The migration that fails is a rename of a table where we use rowversion configured like this:
With this migration created for altering the rowversion column:
And that throws this error:
Include provider and version information
EF Core version: 9.0.0
Database provider: Microsoft.EntityFrameworkCore.SqlServer
Target framework: .NET 9.0
Operating system: Windows & Linux (Local & CICD)
IDE: Visual Studio Enterprise 2022 17.12.0
The text was updated successfully, but these errors were encountered: