Сгруппировать Модель SQLite
Пишу приложение на C# WPF типа будильник. Будильники хранятся в базе SqLite.
Использую Microsoft.EntityFrameworkCore.Sqlite
Подключение
public class AlarmContext : DbContext
{
public DbSet<AlarmModel> AlarmModels { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
_ = optionsBuilder.UseSqlite("Data Source = alarm.db");
}
}
Модель
public class AlarmModel
{
public int Id { get; set; }
public DateTime Date { get; set; }
public int Hours { get; set; }
public int Minutes { get; set; }
public bool Mo { get; set; }
public bool Tu { get; set; }
public bool We { get; set; }
public bool Th { get; set; }
public bool Fr { get; set; }
public bool Sa { get; set; }
public bool Su { get; set; }
}
Ну и сам вопрос Как можно сгруппировать дни недели что-то типа таково
public class AlarmModel
{
public int Id { get; set; }
public DateTime Date { get; set; }
public int Hours { get; set; }
public int Minutes { get; set; }
public DayWeek DayWeek { get; set; }
}
public class DayWeek
{
public int Id { get; set; }
public bool Mo { get; set; }
public bool Tu { get; set; }
public bool We { get; set; }
public bool Th { get; set; }
public bool Fr { get; set; }
public bool Sa { get; set; }
public bool Su { get; set; }
}
Сам пробовал получается DayWeek всегда NULL Это мое первое приложение c Б.Д. поэтому сильно не ругайтесь
Ответы (1 шт):
DayWeek всегда NULL
Не инициализированный ссылочный тип всегда null. Вам нужно было бы создать объект класса
var alarm = new ALarmModel();
alarm.WeekDays = new();
Но то что-вы сделали это создали отдельную сущность связанную 1 к 1 с исходной. Вряд ли это хоть как-то вам помогло.
Если следовать теории нормализации вам надо создать сущность дни недели, а затем связать их с будильниками многие-ко-многим.
Но и это смотрится, как перебор в этом случае.
Вы можете создать флаговый enum и хранить всё так
public class AlarmModel
{
public int Id { get; set; }
public DateTime Date { get; set; }
public int Hours { get; set; }
public int Minutes { get; set; }
public WeekDays WeekDays { get; set; }
}
[Flag]
public Enum DayWeek
{
None = 0,
Monday = 1,
Tuesday = 2,
Wednesday = 4,
Thursday = 8,
Friday = 16,
Saturday = 32,
Sunday = 64,
}
В общем-то неплохо, если не знать, что в C# уже есть перечисление с днями недели и едва ли вам удобнее работать не с ним. Просто можно взять и положить в список включенные дни.
public class AlarmModel
{
public int Id { get; set; }
public DateTime Date { get; set; }
public int Hours { get; set; }
public int Minutes { get; set; }
public List<DayOfWeek> WeekDays { get; set; }
}
Но тут проблема, что списки EF Core не умеет сохранять автоматически (или не умел).
Чтобы он смог нужно в дб-контексте добавлять что-то такое
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.Entity<AlarmModel>()
.Property(e => e.WeekDays)
.HasConversion(
v => string.Join(",", v.Select(e => e.ToString("D")).ToArray()),
v => v.Split(new[] { ',' })
.Select(e => Enum.Parse<DayOfWeek>(e))
.ToList()
);
}
Ну либо 7 версия EF core возможно уже умеет сама это делать, не проверял.