You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
When introducing a new required (NOT NULL) string property to an entity, no default value is being setup implicitly (expected). If you want an empty string as a default value for the property, you have to set it up manually in the model.
However, when changing an existing non-required (NULL) string property to a required one, without specifying an explicit default value, MigrationsModelDiffer.GetDefaultValue() will suddenly introduce an empty string as a default value for that property, that was not requested by the user.
I understand, that it can be helpful to users that NULL values in string-based columns get automatically changed to empty strings, which is probably what most users want in those cases.
But shouldn't this be implemented as part of a one-time UPDATE statement, instead of as an implicit and permanent structure change?
Both operations are irreversible in regards to existing data anyway (destructive change), but the UPDATE statement would at least not lead to an unexpected permanent structure change.
An alternative would be two instead of one alter column statements, where the first one is the current implementation, and the second one immediately removes the empty string default value again. That should have the same effect as an UPDATE statement (though it would not help us with our particular Pomelo issue; see below).
We came across this issue while fixing PomeloFoundation/Pomelo.EntityFrameworkCore.MySql#1476, because MySQL < 8.0.16 does not support default values for longtext columns. In the past, we just ignored those default values silently, but we want to issue a warning in the future, if users setup an unsupported default value.
After implementing a warning for those scenarios, the MigrationsTestBase.Alter_column_make_required() test suddenly failed unexpectedly with the newly introduced warning, because of the implicit empty string default value that EF Core generates for the string column.
Tested with EF Core 6 Preview 5.
The text was updated successfully, but these errors were encountered:
I believe I ran into a consequence of this behavior when attempting to squash migrations. After deleting all the migrations along with the snapshot, the new initial migration does not contain default values for required columns that previously had default values set as they had transitioned from not required to required.
Currently going through and explicitly setting those default values in the context file so the schema will be identical after the squash, but would be nice if those default values hadn't been added in the first place.
When introducing a new required (
NOT NULL
) string property to an entity, no default value is being setup implicitly (expected). If you want an empty string as a default value for the property, you have to set it up manually in the model.However, when changing an existing non-required (
NULL
) string property to a required one, without specifying an explicit default value,MigrationsModelDiffer.GetDefaultValue()
will suddenly introduce an empty string as a default value for that property, that was not requested by the user.I understand, that it can be helpful to users that
NULL
values in string-based columns get automatically changed to empty strings, which is probably what most users want in those cases.But shouldn't this be implemented as part of a one-time
UPDATE
statement, instead of as an implicit and permanent structure change?Both operations are irreversible in regards to existing data anyway (destructive change), but the
UPDATE
statement would at least not lead to an unexpected permanent structure change.An alternative would be two instead of one alter column statements, where the first one is the current implementation, and the second one immediately removes the empty string default value again. That should have the same effect as an
UPDATE
statement (though it would not help us with our particular Pomelo issue; see below).We came across this issue while fixing PomeloFoundation/Pomelo.EntityFrameworkCore.MySql#1476, because MySQL < 8.0.16 does not support default values for
longtext
columns. In the past, we just ignored those default values silently, but we want to issue a warning in the future, if users setup an unsupported default value.After implementing a warning for those scenarios, the
MigrationsTestBase.Alter_column_make_required()
test suddenly failed unexpectedly with the newly introduced warning, because of the implicit empty string default value that EF Core generates for the string column.Tested with EF Core 6 Preview 5.
The text was updated successfully, but these errors were encountered: