-
Notifications
You must be signed in to change notification settings - Fork 259
Expand file tree
/
Copy pathComputedColumnTest.cs
More file actions
142 lines (114 loc) · 4.53 KB
/
ComputedColumnTest.cs
File metadata and controls
142 lines (114 loc) · 4.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
namespace Microsoft.EntityFrameworkCore;
[MinimumPostgresVersion(12, 0)]
public class ComputedColumnTest : IAsyncLifetime
{
[ConditionalFact]
public void Can_use_computed_columns()
{
var serviceProvider = new ServiceCollection()
.AddEntityFrameworkNpgsql()
.BuildServiceProvider();
using var context = new Context(serviceProvider, TestStore.Name);
context.Database.EnsureCreatedResiliently();
var entity = context.Add(
new Entity
{
P1 = 20,
P2 = 30,
P3 = 80
}).Entity;
context.SaveChanges();
Assert.Equal(50, entity.P4);
Assert.Equal(100, entity.P5);
}
[ConditionalFact]
public void Can_use_computed_columns_with_null_values()
{
var serviceProvider = new ServiceCollection()
.AddEntityFrameworkNpgsql()
.BuildServiceProvider();
using var context = new Context(serviceProvider, TestStore.Name);
context.Database.EnsureCreatedResiliently();
var entity = context.Add(new Entity { P1 = 20, P2 = 30 }).Entity;
context.SaveChanges();
Assert.Equal(50, entity.P4);
Assert.Null(entity.P5);
}
private class Context(IServiceProvider serviceProvider, string databaseName) : DbContext
{
private readonly IServiceProvider _serviceProvider = serviceProvider;
private readonly string _databaseName = databaseName;
public DbSet<Entity> Entities { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseNpgsql(NpgsqlTestStore.CreateConnectionString(_databaseName), b => b.ApplyConfiguration())
.UseInternalServiceProvider(_serviceProvider);
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Entity>()
.Property(e => e.P4)
.HasComputedColumnSql("""
"P1" + "P2"
""", stored: true);
modelBuilder.Entity<Entity>()
.Property(e => e.P5)
.HasComputedColumnSql("""
"P1" + "P3"
""", stored: true);
}
}
private class Entity
{
public int Id { get; set; }
public int P1 { get; set; }
public int P2 { get; set; }
public int? P3 { get; set; }
public int P4 { get; set; }
public int? P5 { get; set; }
}
[Flags]
public enum FlagEnum
{
None = 0x0,
AValue = 0x1,
BValue = 0x2
}
public class EnumItem
{
public int EnumItemId { get; set; }
public FlagEnum FlagEnum { get; set; }
public FlagEnum? OptionalFlagEnum { get; set; }
public FlagEnum? CalculatedFlagEnum { get; set; }
}
private class NullableContext(IServiceProvider serviceProvider, string databaseName) : DbContext
{
public DbSet<EnumItem> EnumItems { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseNpgsql(NpgsqlTestStore.CreateConnectionString(databaseName), b => b.ApplyConfiguration())
.UseInternalServiceProvider(serviceProvider);
protected override void OnModelCreating(ModelBuilder modelBuilder)
=> modelBuilder.Entity<EnumItem>()
.Property(entity => entity.CalculatedFlagEnum)
.HasComputedColumnSql("""
"FlagEnum" | "OptionalFlagEnum"
""", stored: true);
}
[ConditionalFact]
public void Can_use_computed_columns_with_nullable_enum()
{
var serviceProvider = new ServiceCollection()
.AddEntityFrameworkNpgsql()
.BuildServiceProvider();
using var context = new NullableContext(serviceProvider, TestStore.Name);
context.Database.EnsureCreatedResiliently();
var entity = context.EnumItems.Add(new EnumItem { FlagEnum = FlagEnum.AValue, OptionalFlagEnum = FlagEnum.BValue }).Entity;
context.SaveChanges();
Assert.Equal(FlagEnum.AValue | FlagEnum.BValue, entity.CalculatedFlagEnum);
}
protected NpgsqlTestStore TestStore { get; private set; } = null!;
public async ValueTask InitializeAsync()
=> TestStore = await NpgsqlTestStore.CreateInitializedAsync("ComputedColumnTest");
public async ValueTask DisposeAsync()
=> await TestStore.DisposeAsync();
}