-
Notifications
You must be signed in to change notification settings - Fork 3.1k
/
ComputedColumnTest.cs
141 lines (112 loc) · 4.49 KB
/
ComputedColumnTest.cs
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
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
namespace Microsoft.EntityFrameworkCore;
#nullable disable
public class ComputedColumnTest : IAsyncLifetime
{
[ConditionalFact]
public void Can_use_computed_columns()
{
var serviceProvider = new ServiceCollection()
.AddEntityFrameworkSqlServer()
.BuildServiceProvider(validateScopes: true);
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()
.AddEntityFrameworkSqlServer()
.BuildServiceProvider(validateScopes: true);
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
{
public DbSet<Entity> Entities { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseSqlServer(SqlServerTestStore.CreateConnectionString(databaseName), b => b.ApplyConfiguration())
.UseInternalServiceProvider(serviceProvider);
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Entity>()
.Property(e => e.P4)
.HasComputedColumnSql("P1 + P2");
modelBuilder.Entity<Entity>()
.Property(e => e.P5)
.HasComputedColumnSql("P1 + P3");
}
}
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
{
// ReSharper disable once UnusedAutoPropertyAccessor.Local
public DbSet<EnumItem> EnumItems { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseSqlServer(SqlServerTestStore.CreateConnectionString(databaseName), b => b.ApplyConfiguration())
.UseInternalServiceProvider(serviceProvider);
protected override void OnModelCreating(ModelBuilder modelBuilder)
=> modelBuilder.Entity<EnumItem>()
.Property(entity => entity.CalculatedFlagEnum)
.HasComputedColumnSql("FlagEnum | OptionalFlagEnum");
}
[ConditionalFact]
public void Can_use_computed_columns_with_nullable_enum()
{
var serviceProvider = new ServiceCollection()
.AddEntityFrameworkSqlServer()
.BuildServiceProvider(validateScopes: true);
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 SqlServerTestStore TestStore { get; private set; }
public async Task InitializeAsync()
=> TestStore = await SqlServerTestStore.CreateInitializedAsync("ComputedColumnTest");
public Task DisposeAsync()
{
TestStore.Dispose();
return Task.CompletedTask;
}
}