Это моя текущая модель EF Core:
public class Application
{
[Key]
public string Name { get; set; }
public HashSet<string> Fields { get; set; }
}
Свойство hashset не работает само по себе, поэтому я добавил это в OnModelCreating
:
modelBuilder.Entity<Application>()
.Property(e => e.Fields)
.HasConversion(
v => v.ToArray(),
v => new HashSet<string>(v));
Это работает в некоторых случаях, но есть большая проблема с ним.
Когда я вставляю приложение изначально, хешсет корректно преобразуется в строковый массив, и драйвер базы данных postgresql сохраняет его правильно.
Однако, когда я позже получу приложение снова, изменим хэш-набор, а затем вызову .SaveChanges();
, оно не работает!
Я должен явно вызвать ctx.Update(app);
, чтобы изменения были сохранены.
Я думаю, это потому, что экземпляр HashSet<string>
не изменяется, меняется только его содержимое, поэтому средство отслеживания изменений не сможет увидеть какие-либо изменения (но, возможно, я ошибаюсь в этом рассуждении).
Как я могу это исправить?
В приведенном здесь примере есть только один HashSet, но другие модели будут иметь гораздо больше свойств, которые будут страдать от той же проблемы.
- Есть ли способ внести изменения в трекВы знаете об этих изменениях?
- Может быть, есть какой-нибудь способ реализовать пользовательскую коллекцию, которая уведомит свой "контейнер" о том, что она была изменена?
- Возможно ли сказатьEF для проверки значения после преобразования вместо самого хэш-набора?