c# #sql-server #entity-framework-core #blazor #blazor-webassembly
#c# #sql-сервер #entity-framework-core #blazor #blazor-webassembly
Вопрос:
У меня есть модель, которая содержит несколько пользователей. Отношения между пользователями и проектом — это отношение «многие ко многим». Ядро EF автоматически сгенерировало третью таблицу для учета этого. Я пытаюсь разрешить пользователю редактировать проект, и одним из свойств редактирования является удаление пользователя. Я был бы признателен за любую информацию о том, что может быть причиной этой ошибки и как я должен обрабатывать List
изменения. Я обрабатывал функции редактирования, помещая a EntityState.Modified
в значение перед сохранением, которое до сих пор работало хорошо. Заранее спасибо!
Я продолжаю сталкиваться с этой ошибкой:
System.InvalidOperationException: The entity type 'List<ApplicationUser>' was not found. Ensure that the entity type has been added to the model.
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.GetOrCreateEntry(Object entity)
at Microsoft.EntityFrameworkCore.DbContext.EntryWithoutDetectChanges[TEntity](TEntity entity)
at Microsoft.EntityFrameworkCore.DbContext.Entry[TEntity](TEntity entity)
at WebApp.Server.Controllers.ProjectsController.PutProject(Guid id, Project project) in C:UsersShahbsourcereposWebAppWebAppServerControllersProjectsController.cs:line 78
at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(Stateamp; next, Scopeamp; scope, Objectamp; state, Booleanamp; isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(Stateamp; next, Scopeamp; scope, Objectamp; state, Booleanamp; isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
at WebApp.Server.Startup.<>c.<<Configure>b__5_0>d.MoveNext() in C:UsersShahbsourcereposWebAppWebAppServerStartup.cs:line 98
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at IdentityServer4.Hosting.IdentityServerMiddleware.Invoke(HttpContext context, IEndpointRouter router, IUserSession session, IEventService events, IBackChannelLogoutService backChannelLogoutService)
at IdentityServer4.Hosting.MutualTlsEndpointMiddleware.Invoke(HttpContext context, IAuthenticationSchemeProvider schemes)
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at IdentityServer4.Hosting.BaseUrlMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapWhenMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.MigrationsEndPointMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
Проблема, похоже, возникает со следующей строкой в контроллере
_context.Entry(project.AssignedUsersToProject).State = EntityState.Modified;
Это должно было бы информировать базу данных об изменении исходной информации
Удаление функции пользователей
private void RemoveUser(string username) {
var user = projectItem.AssignedUsersToProject.First(n => n.UserName.Equals(username));
projectItem.AssignedUsersToProject.Remove(user);
}
Модель проекта
public class Project {
[Key]
public Guid ProjectId { get; set; }
[Required]
public string ProjectName { get; set; }
public bool isComplete { get; set; } = false;
public ICollection<ApplicationUser> AssignedUsersToProject { get; set; }
}
Ответ №1:
Если вы используете объекты, которые отслеживаются EF, вы можете просто удалить их из списка.
Если объекты не отслеживаются, и вы вручную подключаете и устанавливаете EntityState, то обработка многих ко многим, когда объекта объединения нет в модели, является сложной задачей.
Причина, по которой вы получаете ошибку, заключается в том, что вы передаете список в контекст.Запись. EF понимает ApplicationUser, но не List<ApplicationUser> . Это другой «тип».
Комментарии:
1. EF автоматически создает таблицу соединений, когда определено отношение «многие ко многим». Должен ли я пройти через эту таблицу и удалить пользователя из таблицы соединений, что затем правильно удалит их из списка?