MVC3模型视图问题与有2个外键同桌

问题描述:

我是相当新的MVC3框架,并因与编辑一些问题,或者我的一个表创建数据模型。我在此解决方案中使用了EF代码第一种方法。MVC3模型视图问题与有2个外键同桌

我有了2个字段链接到同一个表一个表。例如:[entry]表可以引用2个不同的学生。下面是该代码:

public class Entry 
{ 
    public int EntryID { get; set; } 
    public int DanceEventID { get; set; } 
    public int StudentID { get; set; } 
    public int? SecondaryStudentID { get; set; } 
    public int InstructorID { get; set; } 
    public int DanceID { get; set; } 
    public int DanceLevelID { get; set; } 
    public int StyleID { get; set; } 
    public int? EntryNumber { get; set; } 
    public virtual DanceEvent DanceEvent { get; set; } 
    public virtual Student Student { get; set; } 
    public virtual Student SecondaryStudent { get; set; } 
    public virtual Instructor Instructor { get; set; } 
    public virtual Dance Dance { get; set; } 
    public virtual DanceLevel DanceLevel { get; set; } 
    public virtual Style Style { get; set; } 
} 

public class Student 
{ 
    public int StudentID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public int DanceLevelID { get; set; } 
    public virtual DanceLevel DanceLevel { get; set; } 
    public int StudioID { get; set; } 
    public virtual Studio Studio { get; set; } 
    public int GenderID { get; set; } 
    public virtual Gender Gender { get; set; } 

    public string FullName 
    { 
     get 
     { 
      return FirstName + " " + LastName; 
     } 
    } 
} 

,我有是,当我去编辑或从视图保存和我进入一个SecondaryStudent,这不是节约的问题。看来这个视图只生成一个Student对象。

这是一个MVC3的或限制很可能我只是做错事了。

编辑: 这里是创建视图和控制器代码。

@model HeatBuilder.Models.Entry 

@{ 
    ViewBag.Title = "Create"; 
} 

<h2>Create</h2> 

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"  type="text/javascript"></script> 

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>Entry</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.DanceEventID, "DanceEvent") 
     </div> 
     <div class="editor-field"> 
      @Html.DropDownList("DanceEventID", String.Empty) 
      @Html.ValidationMessageFor(model => model.DanceEventID) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.StudentID, "Student") 
     </div> 
     <div class="editor-field"> 
      @Html.DropDownList("StudentID", String.Empty) 
      @Html.ValidationMessageFor(model => model.StudentID) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.StudentID, "Second Student") 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownList("StudentID", String.Empty) 
     @Html.ValidationMessageFor(model => model.SecondaryStudentID) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.InstructorID, "Instructor") 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownList("InstructorID", String.Empty) 
     @Html.ValidationMessageFor(model => model.InstructorID) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.DanceID, "Dance") 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownList("DanceID", String.Empty) 
     @Html.ValidationMessageFor(model => model.DanceID) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.DanceLevelID, "DanceLevel") 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownList("DanceLevelID", String.Empty) 
     @Html.ValidationMessageFor(model => model.DanceLevelID) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.StyleID, "Style") 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownList("StyleID", String.Empty) 
     @Html.ValidationMessageFor(model => model.StyleID) 
    </div> 

    <p> 
     <input type="submit" value="Create" /> 
    </p> 
</fieldset> 
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.Entity; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using HeatBuilder.Models; 

namespace HeatBuilder.Controllers 
{ 
public class EntryController : Controller 
{ 
    private HeatBuilderContext db = new HeatBuilderContext(); 

    // 
    // GET: /Entry/ 

    public ViewResult Index() 
    { 
     var entries = db.Entries.Include(e => e.DanceEvent).Include(e => e.Student).Include(e => e.SecondaryStudent).Include(e => e.Instructor).Include(e => e.Dance).Include(e => e.DanceLevel).Include(e => e.Style); 
     return View(entries.ToList()); 
    } 

    // 
    // GET: /Entry/Details/5 

    public ViewResult Details(int id) 
    { 
     Entry entry = db.Entries.Find(id); 
     return View(entry); 
    } 

    // 
    // GET: /Entry/Create 

    public ActionResult Create() 
    { 
     ViewBag.DanceEventId = new SelectList(db.DanceEvents, "DanceEventId", "EventName"); 
     ViewBag.StudentID = new SelectList(db.Students, "StudentID", "FullName"); 
     ViewBag.SecondaryStudentID = new SelectList(db.Students, "SecondaryStudentID", "FullName"); 
     ViewBag.InstructorId = new SelectList(db.Instructors, "InstructorID", "FullName"); 
     ViewBag.DanceID = new SelectList(db.Dances, "DanceId", "DanceName"); 
     ViewBag.DanceLevelId = new SelectList(db.DanceLevels, "DanceLevelID", "Description"); 
     ViewBag.StyleID = new SelectList(db.Styles, "StyleID", "StyleDescription"); 
     return View(); 
    } 

    // 
    // POST: /Entry/Create 

    [HttpPost] 
    public ActionResult Create(Entry entry) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Entries.Add(entry); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     ViewBag.DanceEventID = new SelectList(db.DanceEvents, "DanceEventId", "EventName", entry.DanceEventID); 
     ViewBag.StudentID = new SelectList(db.Students, "StudentID", "FullName", entry.StudentID); 
     ViewBag.SecondaryStudentID = new SelectList(db.Students, "SecondaryStudentID", "FullName", entry.SecondaryStudentID); 
     ViewBag.InstructorID = new SelectList(db.Instructors, "InstructorID", "FullName", entry.InstructorID); 
     ViewBag.DanceID = new SelectList(db.Dances, "DanceId", "DanceName", entry.DanceID); 
     ViewBag.DanceLevelID = new SelectList(db.DanceLevels, "DanceLevelID", "Description", entry.DanceLevelID); 
     ViewBag.StyleID = new SelectList(db.Styles, "StyleID", "StyleDescription", entry.StyleID); 
     return View(entry); 
    } 

    // 
    // GET: /Entry/Edit/5 

    public ActionResult Edit(int id) 
    { 
     Entry entry = db.Entries.Find(id); 
     ViewBag.DanceEventID = new SelectList(db.DanceEvents, "DanceEventId", "EventName", entry.DanceEventID); 
     ViewBag.StudentID = new SelectList(db.Students, "StudentID", "FullName", entry.StudentID); 
     ViewBag.SecondaryStudentID = new SelectList(db.Students, "SecondaryStudentID", "FullName", entry.SecondaryStudentID); 
     ViewBag.InstructorID = new SelectList(db.Instructors, "InstructorID", "FullName", entry.InstructorID); 
     ViewBag.DanceID = new SelectList(db.Dances, "DanceId", "DanceName", entry.DanceID); 
     ViewBag.DanceLevelID = new SelectList(db.DanceLevels, "DanceLevelID", "Description", entry.DanceLevelID); 
     ViewBag.StyleID = new SelectList(db.Styles, "StyleID", "StyleDescription", entry.StyleID); 
     return View(entry); 
    } 

    // 
    // POST: /Entry/Edit/5 

    [HttpPost] 
    public ActionResult Edit(Entry entry) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Entry(entry).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     ViewBag.DanceEventID = new SelectList(db.DanceEvents, "DanceEventId", "EventName", entry.DanceEventID); 
     ViewBag.StudentID = new SelectList(db.Students, "StudentID", "FullName", entry.StudentID); 
     ViewBag.SecondaryStudentID = new SelectList(db.Students, "SecondaryStudentID", "FullName", entry.SecondaryStudentID); 
     ViewBag.InstructorID = new SelectList(db.Instructors, "InstructorID", "FullName", entry.InstructorID); 
     ViewBag.DanceID = new SelectList(db.Dances, "DanceId", "DanceName", entry.DanceID); 
     ViewBag.DanceLevelID = new SelectList(db.DanceLevels, "DanceLevelID", "Description", entry.DanceLevelID); 
     ViewBag.StyleID = new SelectList(db.Styles, "StyleID", "StyleDescription", entry.StyleID); 
     return View(entry); 
    } 

    // 
    // GET: /Entry/Delete/5 

    public ActionResult Delete(int id) 
    { 
     Entry entry = db.Entries.Find(id); 
     return View(entry); 
    } 

    // 
    // POST: /Entry/Delete/5 

    [HttpPost, ActionName("Delete")] 
    public ActionResult DeleteConfirmed(int id) 
    {    
     Entry entry = db.Entries.Find(id); 
     db.Entries.Remove(entry); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    protected override void Dispose(bool disposing) 
    { 
     db.Dispose(); 
     base.Dispose(disposing); 
    } 
} 
} 

谢谢。

+1

你混淆了一些技术。 MVC与你的持久层无关。请向我们展示您在保存条目时使用的代码。 – driis 2012-01-07 16:15:40

+0

谢谢。我继续编辑原始帖子,将控制器代码和创建视图/ – edgel1k 2012-01-07 16:35:21

在您的看法中,您使用了两次StudentID,您应该在第二个下拉列表中使用SecondaryStudentID。此外,您完全使用DropDownLists错误。 StudentID是从学生名单中选择的当前选择的StudentID。您不要将SelectList指定为StudentID。您需要创建一个名为StudentList或类似的学生的单独列表。

ViewBag.ListOfStudents = new SelectList(db.Students, "StudentID", "FullName"); 

您应该使用DropDownListFor。

<div class="editor-label"> 
    @Html.LabelFor(model => model.StudentID, "Student") 
</div> 
<div class="editor-field"> 
    @Html.DropDownListFor(model => model.StudentID, ListOfStudents, "Student") 
    @Html.ValidationMessageFor(model => model.StudentID) 
</div> 


<div class="editor-label"> 
    @Html.LabelFor(model => model.SecondaryStudentID, "Second Student") 
</div> 
<div class="editor-field"> 
    @Html.DropDownListFor(model => model.SecondaryStudentID, ListOfStudents, String.Empty) 
    @Html.ValidationMessageFor(model => model.SecondaryStudentID) 
</div> 

如果使用代码第一次(这样的外键关系不是从数据库结构而...假设它存在),和你有一个实体的两个不同的领域,这两者都是外键第二个实体,您可以定义哪个外键用于每个子对象。你可能只需要这个做了两个学生对象,但下面的例子是为你的外键关系中的每一个完成的:

public class Entry 
{ 
    public int EntryID { get; set; } 
    public int DanceEventID { get; set; } 
    public int StudentID { get; set; } 
    public int? SecondaryStudentID { get; set; } 
    public int InstructorID { get; set; } 
    public int DanceID { get; set; } 
    public int DanceLevelID { get; set; } 
    public int StyleID { get; set; } 
    public int? EntryNumber { get; set; } 
    [ForeignKey("DanceEventID")] 
    public virtual DanceEvent DanceEvent { get; set; } 
    [ForeignKey("StudentID")] 
    public virtual Student Student { get; set; } 
    [ForeignKey("SecondaryStudentID")] 
    public virtual Student SecondaryStudent { get; set; } 
    [ForeignKey("InstructorID")] 
    public virtual Instructor Instructor { get; set; } 
    [ForeignKey("DanceID")] 
    public virtual Dance Dance { get; set; } 
    [ForeignKey("DanceLevelID")] 
    public virtual DanceLevel DanceLevel { get; set; } 
    [ForeignKey("StyleID")] 
    public virtual Style Style { get; set; } 
} 

虽然这是否与不节能的数据无法确定导致您的问题当然。

我也是这个实体模型的新手。但我认为你所指的是一个称为自我引用的东西。例如,员工可能有一个名为经理的字段。现在,由于经理也是一名员工,所以该领域指向该表中的员工表。这是如何实施它的一个非常好的问题。也许用它的主键和一个外键创建另一个表格,这个外键可以在这种情况下从管理员字段填充到没有其他数据的学生表中。如果允许,这将建立1对1关系。让我知道你是如何解决这个问题的。

或者你可以用学生证的学生secondarly ID与请求 ,当它再次呈现请求学生证