У нас возникли проблемы с проектированием нашего многопоточного приложения с платформой Entity Framework и хотелось бы получить некоторые рекомендации. Мы создаем объекты в разных потоках, объекты добавляются в коллекции, которые затем привязываются к различным элементам управления wpf. Класс ObjectContext не является потокобезопасным, поэтому, управляя этим, у нас есть по существу два решения:Entity Framework и многопоточность
Решение 1 имеет единый контекст и тщательно использует блокировку, чтобы гарантировать, что 2 потока не обращаются к нему в одно и то же время. Это было бы относительно просто реализовать, но потребовало бы, чтобы контекст был живым на протяжении всего приложения. Неплохо ли идея открыть один экземпляр контекста?
Решение 2 - создавать объекты контекста по требованию, а затем немедленно отделять объекты, а затем удерживать их в наших собственных коллекциях, а затем повторно присоединять их для любого обновления. У этого есть некоторые серьезные проблемы для использования, хотя, как при отсоединении объектов они теряют ссылки на объекты свойств навигации. Также есть проблема, что 2 потока могут пытаться получить доступ к одному объекту, и оба пытаются связать() с контекстом. Кроме того, нам нужно будет предоставлять новый контекст каждый раз, когда мы хотим получить доступ к свойствам навигации сущностей.
В: Являются ли какие-либо из двух решений действительными, если не так, как вы порекомендуете нам заняться этим?
@usr у вас есть идея лучше? – Cocowalla
@Cocowalla, не зная, какой большой сценарий обращается к OP, я этого не делаю. Оба его решения приведут к мучительной реализации, поэтому я предупреждаю его. Может быть, он может пойти совсем по другому пути и использовать EF однопоточным способом (как это предполагается использовать). – usr
Еще одно замечание: вы НЕ МОЖЕТЕ вносить какие-либо изменения в объект, если он отсоединен, поскольку ни один контекст в настоящее время не отслеживает это изменение. Это изменение не будет сохраняться при вызове SaveChanges(). – JoeCool