Entity Framework 通过 UserId 获取文档

Entity Framework Get Document by UserId

我有一个继承默认身份的项目和用户模型 class。

这两个共享多对多关系。

public class Project
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }

    public ICollection<AppUser> users { get; set; }
}

public class AppUser : IdentityUser
{
    public string DisplayName { get; set; }
    public ICollection<Project> projects { get; set; }  
}

我还有一个项目控制器,我想在其中显示包含当前用户的所有项目。 (项目可以有多个用户) 我也希望能够创建项目。

    [Authorize]
    public IActionResult Index(string id)
    {

        IEnumerable<Project> objProjectList = _unitOfWork.Project.GetAll();
        return View(objProjectList);
    }

我首先通过像这样的锚标记传递用户 ID。

<a class="nav-link text-dark" 
   asp-area="" asp-controller="Project" asp-action="Index" 
   asp-route-id="@UserManager.GetUserId(User)">Projects</a>

如何使用id获取我的项目控制器中只包含id对应用户的项目?

如何使用相同的 ID 创建一个项目,用户附加在同一控制器中的 post 路由上?

我是否应该避免通过锚标记传递用户 ID 等敏感数据并通过其他方式获取用户 ID?

如果有任何意见,我将不胜感激。

您可以尝试这样的操作。但是使用 ViewModels 保护你的数据库是个好主意。此外,您的所有逻辑都应该在服务 class 中,而不是在控制器中。您传递 Id 的方式完全没问题。

public interface IProjectService
{
     IEnumerable<Project> GetAllProjectsByUserId(object userId);
}

public class ProjectService : IProjectService
{
     public IEnumerable<Project> GetAllProjectsByUserId(string userId)
     {
          return _unitOfWork.Project.Where(x => x.users.Any(x => 
                  x.Id = userId)).ToList();
     }
}

将Service提供给StartUp中的依赖容器class

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<IProjectService , ProjectService >();
}

然后在Controller中调用Service

private readonly IProjectService projectService;
public ControllerName(IProjectService projectService)
{
    this.projectService = projectService;
}

[Authorize]
public IActionResult Index(string id)
{

     var viewModel = projectService.GetAllProjectsByUserId(id);

     return View(objProjectList);
}

还有更多的事情要做,例如存储库、dtos eg,但这对于开始是一个很好的选择