[英]EntityFramework many to many realation in project MVC
我有三个表TaskModels,TaskAssigned和Users(AspNetUsers)。 我使用Task TaskModels创建新任务,使用Task Assigned模型创建此任务给用户。 一切正常,但是当我在图像中发布时,我只是获得了分配给用户的用户ID和任务ID女巫。 但我想查看用户名任务名称而不是其ID。 这是我的代码和结果img。
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; }
}
这是我的TaskAssignedsController
public class TaskAssignedsController : Controller
{
private ApplicationDbContext db = new ApplicationDbContext();
// GET: TaskAssigneds
public ActionResult Index()
{
var list = db.TaskAssigneds.Include(o => o.TasksModel).Include(o => o.User);
return View(list.ToList());
}
// GET: TaskAssigneds/Create
public ActionResult Create()
{
ViewBag.TaskModelId = new SelectList(db.TasksModels,"Id", "Heading");
ViewBag.UserId = new SelectList(db.Users, "ApplicationUserId", "UserName");
return View();
}
// POST: TaskAssigneds/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see https://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "Id,TaskModelId,UserId")] TaskAssigned taskAssigned)
{
if (ModelState.IsValid)
{
db.TaskAssigneds.Add(taskAssigned);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.TaskModelId = new SelectList(db.TasksModels, "Id", "Heading", taskAssigned.TasksModel.Heading);
ViewBag.UserId = new SelectList(db.Users, "ApplicationUserId", "UserName", taskAssigned.User.UserName);
return View(taskAssigned);
}
解决该问题的更简单方法(不推荐)是:
@Html.DisplayFor(modelItem => item.TaskModelId)
@Html.DisplayFor(modelItem => item.UserId)
用这个:
@Html.DisplayFor(modelItem => item.TasksModel.Name)
@Html.DisplayFor(modelItem => item.User.Name)
但是,看起来您的TasksModel
没有名称属性。 另外,您还应该修复@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());
}
...最终在您的Index.cshtml
,编辑模型的类型:
@model IEnumerable<DeadLiner.Models.TasksAssignedViewModel>
这样,就不再需要使用Include
。 由于您不再从数据库中获取所有字段,因此这也使查询速度更快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.