29

Почему это происходит, когда мы вызываем метод AccountApiController.Register()?«Контекст не может использоваться во время создания модели» исключение с идентификатором ASP.NET

  • Что пытается использовать контекст?
  • Что пытается создать контекст?
  • как нам избежать этого?
  • как мы отлаживаем это?

«Сообщение»: «Произошла ошибка.»,

«ExceptionMessage»:. "Контекст не может быть использована в то время как модель создается Это исключение может быть выброшен, если контекст используются внутри метода OnModelCreating или если тот же экземпляр контекста доступа к нескольким потокам одновременно. Обратите внимание, что члены экземпляра из DbContext и смежных классов не гарантируются поточно безопасными ".,

"ExceptionType": "System.InvalidOperationException",

"StackTrace":»

на System.Web.Http.ApiController.d__1.MoveNext()

--- Конец трассировки стека из предыдущее место, где было брошено исключение

в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task задач)

в System.Runtime.CompilerServices.TaskAwaiter .HandleNonSuccessAndDebugger Уведомление (Task> задача)

на System.Web.Http.Dispatcher.HttpControllerDispatcher.d__0.MoveNext()»

+2

Убедитесь, что вы не используете один и тот же объект контекста для различных запросов и убедитесь, что вы посылаете запрос после OnModelCreating , вы можете добавить туда точку останова в конце метода. –

+0

Как мы убеждаемся, что мы не используем один и тот же объект контекста для разных запросов? Кроме того, я не уверен, что вы подразумеваете, добавив точку останова, потому что у нас нет метода OnModelCreating. –

+0

Я узнал, что идентификатор ASP.NET использует шаблон Factory, чтобы получить один экземпляр UserManager за запрос; это может быть проблемой, потому что наш UserManager хранит данные в нашем DbContext. Хм. –

ответ

20

Проблема была в том, что мы НЕ использовали заводскую модель, которая MS recommends.

Вы можете использовать Factory-реализацию, чтобы получить экземпляр UserManager из контекста OWIN. ... Это рекомендуемый способ получения экземпляра UserManager для каждого запроса для приложения.

В результате «один экземпляр контекста обращается одновременно несколькими потоками», потому что несколько запросов и, таким образом, потоки разделяют DbContext.

Это верно. Создает новый экземпляр MyDbContext для каждого вызова функции UserManagerFactory.

UserManagerFactory 
=() => new UserManager<IdentityUser>(new UserStore<IdentityUser>(new MyDbContext())); 

Неправильное использование. Он выглядит похожим, но не создает новый экземпляр для каждого вызова UserManagerFactory. Это то, что мы использовали, ergo наш сайт сломался.

var userStore = new UserStore<IdentityUser>(new MyDbContext());      
var userManager = new UserManager<IdentityUser>(userStore); 
UserManagerFactory =() => userManager; 
+3

Где я должен помещать это в свой проект? Я использую Unity.Mvc как преобразователь зависимости. Кроме того, я работаю с моим собственным UnityOfWork, в который я вставляю DbContext, который используется для всех моих репозиториев. –

1

ли вы переопределить метод OnModelCreating? Если да, можете ли вы поделиться им или всем классом контекста?

Если нет, то вам следует обратить внимание на следующее сообщение об ошибке

или если тот же экземпляр контекста доступны несколько потоков одновременно. Обратите внимание, что члены экземпляра DbContext и связанные классы не гарантируются потокобезопасностью.

Если это не поможет, вы используете неизменный проект веб-API, который создается Visual Studio?

+0

Мы не переопределяем метод OnModelCreating. Также мы не используем неизменный проект веб-API ... скорее, мы изменили DbContext, который хранит как идентификатор ASP.NET данных и других данных веб-сайта. –

+1

Мы не знаем, как определить, доступен ли один и тот же экземпляр контекста несколькими потоками одновременно. Хм. –

+1

+1 для подчеркивания потенциальной проблемы многопоточности. –

21

Эта ошибка также может возникнуть в случае неправильного connectionString. Проверьте, действительно ли connectionString (никаких опечаток и т. Д.).

+2

Спасибо, человек! Строка подключения была неправильной в моем случае. – Isaac

+0

Спасибо! Это сделал трюк! –

0

Если вы получаете записи из таблицы/вида, убедитесь, что у вас есть достаточный доступ к объектам БД.

У меня была такая же проблема, и я разрешил его, выполнив

sp_change_users_login [ @Action = ] 'action' [ , [ @UserNamePattern = ] 'user' ] [ , [ @LoginName = ] 'login' ] [ , [ @Password = ] 'password' ] [;] 


sp_change_users_login 'update_one' 'dbuser' 'dblogin' 

Find more snippet and details

Смежные вопросы