dotnet / dotnet/efcore

Migrations: when adding required column with custom converter and unspecified default value to existing table, we don't pass through converter to generate the default "empty" value

Open
#33,038 0 comments 0 reactions 0 assignees View on GitHub
area-migrations
Dominant language
C#
Stars
14.8k
Forks
3.4k
PR merge metrics
PR metrics pending

Description

Example model migrated from:

```
builder.Entity(
"Customer", e =>
{
e.Property("Id").ValueGeneratedOnAdd();
e.HasKey("Id");
e.Property("Name");
e.ToTable("Customers");
}
```

model migrated to:

```
builder.Entity(
"Customer", e =>
{
e.Property("Id").ValueGeneratedOnAdd();
e.HasKey("Id");
e.Property("Name");
e.Property>("Numbers").HasConversion(new ValueConverter, string>(
convertToProviderExpression: x => x != null && x.Count > 0 ? "some numbers" : "nothing",
convertFromProviderExpression: x => x == "nothing" ? new List { } : new List { 7, 8, 9 })).IsRequired();
e.ToTable("Customers");
})
```

sql:

```sql
ALTER TABLE [Customers] ADD [Numbers] nvarchar(max) NOT NULL DEFAULT N'';
```

I would expect to see:

```sql
ALTER TABLE [Customers] ADD [Numbers] nvarchar(max) NOT NULL DEFAULT N'nothing';
```

However, if we specify default value ourselves like so:

```
builder.Entity(
"Customer", e =>
{
e.Property("Id").ValueGeneratedOnAdd();
e.HasKey("Id");
e.Property("Name");
e.Property>("Numbers").HasConversion(new ValueConverter, string>(
convertToProviderExpression: x => x != null && x.Count > 0 ? "some numbers" : "nothing",
convertFromProviderExpression: x => x == "nothing" ? new List { } : new List { 7, 8, 9 }))
.HasDefaultValue(new List { 42 })
.IsRequired();
e.ToTable("Customers");
})
```

we generate expected migration sql:

```sql
ALTER TABLE [Customers] ADD [Numbers] nvarchar(max) NOT NULL DEFAULT N'some numbers';
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.