C# 项目MVC中的EntityFramework多对多实现
我有一个三表TaskModels、TaskAssigned和Users(AspNetUsers)。使用Task TaskModels我创建新任务,使用Task Assigned model我将此任务分配给用户。一切正常,但当我在图像中发布时,我只获得分配给用户的用户id和任务id。但我想看到的是用户名任务名而不是他们的id。这是我的代码和结果imgC# 项目MVC中的EntityFramework多对多实现,c#,asp.net-mvc,entity-framework,asp.net-mvc-5,entity-framework-6,C#,Asp.net Mvc,Entity Framework,Asp.net Mvc 5,Entity Framework 6,我有一个三表TaskModels、TaskAssigned和Users(AspNetUsers)。使用Task TaskModels我创建新任务,使用Task Assigned model我将此任务分配给用户。一切正常,但当我在图像中发布时,我只获得分配给用户的用户id和任务id。但我想看到的是用户名任务名而不是他们的id。这是我的代码和结果img public class TaskAssigned { public int Id { get; set; } public int
public class TaskAssigned
{
public int Id { get; set; }
public int TaskModelId { get; set; }
public int UserId { get; set; }
public TasksModel TasksModel { get; set; }
public ApplicationUser User { get; set; }
}
public class TasksModel
{
public int Id { get; set; }
[Required(ErrorMessage = "Heading is required")]
public string Heading { get; set; }
[Required(ErrorMessage = "Content is required")]
public string Content { get; set; }
[Required(ErrorMessage = "Start Date is required")]
[DisplayName(displayName: "Start Date")]
public DateTime StartDate { get; set; }
[Required(ErrorMessage = "Deadline is required")]
[DisplayName(displayName: "Deadline")]
public int DeadlineTask { get; set; }
}
public class ApplicationUser
{
public string Name { get; set; }
public List<TaskAssigned> TaskAssigneds { get; set; }
}
解决此问题的更简单方法(不推荐)是:
@Html.DisplayFor(modelItem => item.TaskModelId)
@Html.DisplayFor(modelItem => item.UserId)
使用以下命令:
@Html.DisplayFor(modelItem => item.TasksModel.Name)
@Html.DisplayFor(modelItem => item.User.Name)
但是,您的任务模型
似乎没有名称属性。此外,您还应该修复@Html.DisplayNameFor
(两列)
现在,我建议创建一个如下的
public class TasksAssignedViewModel
{
public int TaskModelId { get; set; }
public int UserId { get; set; }
public int TaskModelName { get; set; }
public int UserName { get; set; }
}
public ActionResult Index()
{
var list = db.TaskAssigneds.Select(l => new TasksAssignedViewModel
{
TaskModelId = l.TasksModel.Id,
UserId = l.User.Id,
TaskModelName = l.TasksModel.Name,
UserName = l.User.Name
});
return View(list.ToList());
}
…然后在索引操作中,将查询投影到该视图模型中,如下所示:
public class TasksAssignedViewModel
{
public int TaskModelId { get; set; }
public int UserId { get; set; }
public int TaskModelName { get; set; }
public int UserName { get; set; }
}
public ActionResult Index()
{
var list = db.TaskAssigneds.Select(l => new TasksAssignedViewModel
{
TaskModelId = l.TasksModel.Id,
UserId = l.User.Id,
TaskModelName = l.TasksModel.Name,
UserName = l.User.Name
});
return View(list.ToList());
}
…最后,在Index.cshtml
中,编辑模型的类型:
@model IEnumerable<DeadLiner.Models.TasksAssignedViewModel>
@model IEnumerable
这样,就不再需要使用
Include
。这也使查询速度加快了一点,因为您不再从数据库中获取所有字段。我不再需要TaskAssigned表了?或者我只是添加一个TasksSignedViewModel?@muradheydarov你需要这个表。我们只是在TasksSignedViewModel
中对其进行转换。我建议您阅读以了解投影是如何工作的。我按照您所写的做了所有事情,但在视图模型中返回null。我找不到问题出在哪里。我在哪里会犯错?