Тип объекта не найден при редактировании содержимого

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, то обработка многих ко многим, когда объекта объединения нет в модели, является сложной задачей.

https://docs.microsoft.com/en-us/answers/questions/251966/ef-core-5-many-to-many-disconected-addremove-witho.html

Причина, по которой вы получаете ошибку, заключается в том, что вы передаете список в контекст.Запись. EF понимает ApplicationUser, но не List<ApplicationUser> . Это другой «тип».

Комментарии:

1. EF автоматически создает таблицу соединений, когда определено отношение «многие ко многим». Должен ли я пройти через эту таблицу и удалить пользователя из таблицы соединений, что затем правильно удалит их из списка?