using (var context = new AppDbContext())
{
await context.Database.EnsureDeletedAsync();
await context.Database.EnsureCreatedAsync();
context.AddRange(
new School
{
Name = "Stowe School",
Founded = new(1923, 5, 11),
Terms =
{
new() { Name = "Michaelmas", FirstDay = new(2022, 9, 7), LastDay = new(2022, 12, 16) },
new() { Name = "Lent", FirstDay = new(2023, 1, 8), LastDay = new(2023, 3, 24) },
new() { Name = "Summer", FirstDay = new(2023, 4, 18), LastDay = new(2023, 7, 8) }
},
OpeningHours =
{
new(DayOfWeek.Sunday, null, null),
new(DayOfWeek.Monday, new(8, 00), new(18, 00)),
new(DayOfWeek.Tuesday, new(8, 00), new(18, 00)),
new(DayOfWeek.Wednesday, new(8, 00), new(18, 00)),
new(DayOfWeek.Thursday, new(8, 00), new(18, 00)),
new(DayOfWeek.Friday, new(8, 00), new(18, 00)),
new(DayOfWeek.Saturday, new(8, 00), new(17, 00))
}
},
new School
{
Name = "Farr High School",
Founded = new(1964, 5, 1),
Terms =
{
new() { Name = "Autumn", FirstDay = new(2022, 8, 16), LastDay = new(2022, 12, 23) },
new() { Name = "Winter", FirstDay = new(2023, 1, 9), LastDay = new(2023, 3, 31) },
new() { Name = "Summer", FirstDay = new(2023, 4, 17), LastDay = new(2023, 6, 29) }
},
OpeningHours =
{
new(DayOfWeek.Sunday, null, null),
new(DayOfWeek.Monday, new(8, 45), new(15, 35)),
new(DayOfWeek.Tuesday, new(8, 45), new(15, 35)),
new(DayOfWeek.Wednesday, new(8, 45), new(15, 35)),
new(DayOfWeek.Thursday, new(8, 45), new(15, 35)),
new(DayOfWeek.Friday, new(8, 45), new(12, 50)),
new(DayOfWeek.Saturday, null, null)
}
});
await context.SaveChangesAsync();
}
using (var context = new AppDbContext())
{
await context.Schools
.SelectMany(e => e.OpeningHours)
.Where(e => e.DayOfWeek == DayOfWeek.Friday)
.ExecuteUpdateAsync(s => s.SetProperty(t => t.OpensAt, t => t.OpensAt!.Value.AddHours(-1)));
}
public class AppDbContext : DbContext
{
public DbSet<School> Schools => Set<School>();
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseSqlServer("Data Source=localhost;Database=BuildBlogs;Integrated Security=True;Trust Server Certificate=True;ConnectRetryCount=0")
.LogTo(Console.WriteLine, LogLevel.Debug)
.EnableSensitiveDataLogging();
}
public class School
{
public int Id { get; set; }
public string Name { get; set; } = null!;
public DateOnly Founded { get; set; }
public List<Term> Terms { get; } = new();
public List<OpeningHours> OpeningHours { get; } = new();
}
public class Term
{
public int Id { get; set; }
public string Name { get; set; } = null!;
public DateOnly FirstDay { get; set; }
public DateOnly LastDay { get; set; }
public School School { get; set; } = null!;
}
[Owned]
public class OpeningHours
{
public OpeningHours(DayOfWeek dayOfWeek, TimeOnly? opensAt, TimeOnly? closesAt)
{
DayOfWeek = dayOfWeek;
OpensAt = opensAt;
ClosesAt = closesAt;
}
public DayOfWeek DayOfWeek { get; private set; }
public TimeOnly? OpensAt { get; set; }
public TimeOnly? ClosesAt { get; set; }
}
This worked on 8.0 on SQL Server, but fails on the current daily build of 9. (Note that it always failed on SQLite and with JSON on SQL Server.)
Repro