За последние несколько месяцев я впервые разрабатывал приложение с использованием кода Entity Framework и sql server CE. Я нашел комбинацию этих двух очень полезной, и по сравнению с моим старым способом работы (особенно с ADO.NET) она позволяет безумно сократить время разработки.
Однако сегодня утром я и некоторые коллеги столкнулись с проблемой, которую мы никогда не видели ни в какой документации по SqlServer CE. Он не может обрабатывать более одной вставки одновременно!
Я считал, что CE может стать моей предпочтительной базой данных, пока я не столкнулся с этой проблемой. Причина, по которой я обнаружил это, заключалась в моем приложении, которое мне нужно было сделать сразу несколько запросов к веб-службе, и это создавало узкое место, поэтому я продолжил использовать вызов Parallel.Invoke
для выполнения нескольких запросов.
Все работало нормально, пока я не включил службу регистрации сообщений приложений. На этом этапе я начал получать следующую ошибку при выполнении веб-запросов:
A duplicate value cannot be inserted into a unique index. [ Table name = Accounts,Constraint name = PK__Accounts__0000000000000016 ]
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Data.SqlServerCe.SqlCeException: A duplicate value cannot be inserted into a unique index. [ Table name = Accounts,Constraint name = PK__Accounts__0000000000000016 ]
«Странно, - подумал я. И мое первое замечание заключалось в том, что это должно быть связано с DbContext
, возможно, DbContext
, который я использовал, был статическим или что-то еще в моем классе Repository
было статическим и вызывало проблему, но после того, как я понюхал, я убедился, что это не имеет никакого отношения с моим кодом.
Затем я обратил на это внимание моих коллег, и через некоторое время было решено, что это должен быть SqlServer CE, и после того, как мы все настроили разные тестовые проекты, пытаясь воссоздать проблему с помощью потоков, она воссоздалась почти каждый раз, а при использовании Sql Server Express: проблема не возникла.
Мне просто кажется немного странным, что CE не может справиться с чем-то таким простым. Я имею в виду, что проблема не только в потоковой передаче - вы говорите мне, что ее нельзя использовать для веб-приложения, где два пользователя могут одновременно вставлять в таблицу ... БЕЗУМИЕ!
В любом случае, просто интересно, столкнулся ли кто-нибудь еще так поздно с проектом, как я, и был шокирован (и раздражен) тем, что он работает таким образом? Также было бы круто, если бы кто-нибудь мог пролить свет на то, почему он ограничен таким образом.