簡體   English   中英

EntityFramework在項目MVC中的多對多實現

[英]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);
    }  

TaskAssigneds索引視圖

而我的結果

解決該問題的更簡單方法(不推薦)是:

@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM