Безопасность платформы Entity Framework

Объекты контекста, созданные Entity Framework, не являются streamобезопасными.

Что делать, если я использую два отдельных контекста объекта, по одному для каждого streamа (и каждый раз вызываем SaveChanges() ) – будет ли это быть streamобезопасным?

 // this method is called from several threads concurrently public void IncrementProperty() { var context = new MyEntities(); context.SomeObject.SomeIntProperty++; context.SaveChanges(); } 

Я считаю, что сущность фреймворка контекста реализует какую-то переменную ‘counter’, которая отслеживает, являются ли текущие значения в контексте свежими или нет.

  1. С помощью кода выше – вызванного из отдельных streamов – мне все еще нужно блокировать инкремент / savechanges?
  2. Если да, то каков предпочтительный способ сделать это в этом простом сценарии?

Более того, один stream, работающий в одном контексте Entity Framework, не является streamобезопасным.

Отдельный экземпляр контекста для каждого streamа является streamобезопасным. Пока каждый stream исполнения имеет свой собственный экземпляр контекста EF, вы будете в порядке.

В вашем примере вы можете вызывать этот код из любого количества streamов одновременно, и каждый из них будет счастливо работать со своим собственным контекстом.

Однако я бы предложил реализовать блок «use» для этого следующим образом:

 // this method is called from several threads concurrently public void IncrementProperty() { using (var context = new MyEntities()) { context.SomeObject.SomeIntProperty++; context.SaveChanges(); } } 

Я верю, что «SomeObject.SomeIntProperty» является статическим. Это не имеет ничего общего с тем, что Entity является streamобезопасным. Если вы пишете переменные Static в многопоточной среде, вы всегда должны обертывать их двойной блокировкой для обеспечения безопасности streamов.

Вы можете использовать заводский подход, вместо того, чтобы использовать экземпляр perse, запустите свой DbContext как фабрику, посмотрите на это: https://github.com/vany0114/EF.DbContextFactory

Это безопаснее, и вы избегаете жесткого кодирования создания экземпляра в свои репозитории.

http://elvanydev.com/EF-DbContextFactory/

Существует расширение для Ninject, чтобы сделать это очень простым способом, просто вызвав метод kernel.AddDbContextFactory(); также вам нужно изменить свой repository, получив Func

  • Более эффективный способ для цикла паузы
  • Контейнер Jboss Java EE и ExecutorService
  • Нужно ли защищать доступ для чтения к контейнеру STL в многопоточной среде?
  • Как заставить BackgroundWorker возвращать объект
  • Swing - Обновить ярлык
  • ОЖИДАНИЕ на sun.misc.Unsafe.park (родной метод)
  • В чем разница между Thread start () и Runnable run ()
  • Неправильная публикация ссылки на объект Java
  • Bash: ограничить количество одновременных заданий?
  • Невозможно создать кэшированный пул streamов с ограничением размера?
  • Executors.newCachedThreadPool () по сравнению с Executors.newFixedThreadPool ()
  • Давайте будем гением компьютера.