2016-01-13 3 views
0

Я хотел бы заблокировать пользователя из базы данных aspnetusers в SQL с помощью MVC. Это мой админ контроллер:Заблокировать пользователя в SQL с помощью MVC

[HttpPost] 
    public ActionResult LockUser(string Id) 
    { 
     var datastore = new UserStore<ApplicationUser>(); 
     var manager = new UserManager<ApplicationUser, string>(datastore); 
     //update current user object in memory 
     //var user = User.Identity.GetApplicationUser(); 
     var user = manager.FindById(Id); 
     user.LockoutEnabled = true; 
     user.LockoutEndDateUtc = DateTime.UtcNow.AddYears(2); 
     manager.UpdateAsync(user); 
     var dbcontext = datastore.Context; 
     //update user object in database 
     dbcontext.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

Это мое мнение администратора:

@using (Html.BeginForm("LockUser", "Admin", new { id = x.Id })) 
{ 
    <input type="submit" class="button" value="Lock" /> 
} 

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

System.InvalidOperationException was unhandled by user code 
    HResult=-2146233079 
    Message=The entity type ApplicationUser is not part of the model for the current context. 
    Source=EntityFramework 
    StackTrace: 
     at System.Data.Entity.Internal.InternalContext.UpdateEntitySetMappingsForType(Type entityType) 
     at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) 
     at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize() 
     at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext() 
     at System.Data.Entity.Internal.Linq.InternalSet`1.FindAsync(CancellationToken cancellationToken, Object[] keyValues) 
     at System.Data.Entity.DbSet`1.FindAsync(CancellationToken cancellationToken, Object[] keyValues) 
     at System.Data.Entity.DbSet`1.FindAsync(Object[] keyValues) 
     at Microsoft.AspNet.Identity.EntityFramework.EntityStore`1.GetByIdAsync(Object id) 
     at Microsoft.AspNet.Identity.EntityFramework.UserStore`6.<GetUserAggregateAsync>d__6c.MoveNext() 
    --- End of stack trace from previous location where exception was thrown --- 
     at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
     at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
     at Microsoft.AspNet.Identity.AsyncHelper.RunSync[TResult](Func`1 func) 
     at Microsoft.AspNet.Identity.UserManagerExtensions.FindById[TUser,TKey](UserManager`2 manager, TKey userId) 
     at BlogMaxim.Controllers.AdminController.LockUser(String Id) in C:\nmct\2e Jaar\1e sem\project\BlogMaxim\BlogMaxim\Controllers\AdminController.cs:line 70 
     at lambda_method(Closure , ControllerBase , Object[]) 
     at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) 
     at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) 
     at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) 
     at System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState) 
     at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult) 
     at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End() 
     at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) 
     at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d() 
     at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() 
    InnerException: 
+0

Вы пытались отладить? – Marusyk

+0

В нем говорится, что «var us» имеет значение null. Я не понимаю, как это может быть пустым. – Maxim

+0

Попробуйте использовать это в первой строке вместо текущей: 'var datastore = new UserStore (новый ApplicationDbContext());' Также убедитесь, что dataStore указывает на правильную базу данных, которую вы можете знать, отлаживая ваш код Я подозреваю, что ваша строка подключения к базе данных не используется системой идентификации ASP.Net. – Sunil

ответ

0

Используйте следующий код при обновлении с использованием UserManager. Вы должны вызвать метод SaveChanges в контексте базы данных, чтобы сохранить изменения, иначе он не будет сохраняться в базе данных.

var datastore = new UserStore<ApplicationUser>(); 
var manager = new UserManager<ApplicationUser,string>(dataStore); 
//update current user object in memory 
//var user = User.Identity.GetApplicationUser(); 
var user = manager.FindById(Id) 
user.LockoutEnabled = true; 
user.LockoutEndDateUtc = DateTime.UtcNow.AddYears(2); 
manager.UpdateAsync(user); 
var dbcontext = datastore.Context; 
//update user object in database 
dbcontext.SaveChanges(); 

Включите следующее пространство пространства вверху своего кода. Кроме того, в таких случаях вы можете просто поместить курсор в левый угол красной подчеркивания и щелкнуть по значку, чтобы вызвать предложения Visual Studio.

using Microsoft.AspNet.Identity; 
using Microsoft.AspNet.Identity.EntityFramework; 

Добавить ссылки на следующие узлы: Microsoft.AspNet.Identity.Core.dll and Microsoft.AspNet.Identity.EntityFramework.dll

+0

Я просто добавляю этот код в существующий код? – Maxim

+0

Замените его на этот код. – Sunil

+0

Я только что обновил код в соответствии с вашим сценарием. – Sunil

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