Я не думаю, что сохранение словаря является хорошей идеей (я даже не могу представить, как это будет сделано в базе данных). Как я вижу из вашего исходного кода, вы используете FirstName в качестве ключа. На мой взгляд, вы должны изменить словарь на HashSet. Таким образом, вы можете сохранить скорость, а также сохранить ее в базе данных. Вот пример:
class Course
{
public Course() {
this.People = new HashSet<Person>();
}
public ISet<Person> People { get; set; }
public int Id { get; set; }
}
После этого вы можете создать из него словарь или продолжать использовать хэш-набор. Пример для словаря:
private Dictionary<string, Person> peopleDictionary = null;
public Dictionary<string, Person> PeopleDictionary {
get {
if (this.peopleDictionary == null) {
this.peopleDictionary = this.People.ToDictionary(_ => _.FirstName, _ => _);
}
return this.peopleDictionary;
}
}
Обратите внимание, что это будет означать, что ваш набор сотрудников станет несинхронизированным после добавления / удаления в / из словаря. Для внесения изменений в syn c вы должны переписать метод SaveChanges в вашем контексте, например:
public override int SaveChanges() {
this.SyncPeople();
return base.SaveChanges();
}
public override int SaveChanges(bool acceptAllChangesOnSuccess) {
this.SyncPeople();
return base.SaveChanges(acceptAllChangesOnSuccess);
}
public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = default) {
this.SyncPeople();
return base.SaveChangesAsync(cancellationToken);
}
public override Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default) {
this.SyncPeople();
return base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);
}
private void SyncPeople() {
foreach(var entry in this.ChangeTracker.Entries().Where(_ = >_.State == EntityState.Added || _.State == EntityState.Modified)) {
if (entry.Entity is Course course) {
course.People = course.PeopleDictionary.Values.ToHashSet();
}
}
}
EDIT: Чтобы иметь работающий код, вы нужно будет указать EF не отображать словарь через атрибут NotMapped.
[NotMapped]
public Dictionary<string, Person> PeopleDictionary { ... }