3

MVC3 프레임 워크를 처음 사용하며 테이블 중 하나에 대한 데이터 편집 또는 생성과 관련하여 몇 가지 문제가 있습니다. 이 솔루션에서 EF 코드 첫 번째 방법을 사용했습니다.MVC3 모델보기 같은 테이블에 외래 키가 2 개있는 모델의 문제

동일한 테이블로 다시 링크되는 2 개의 필드가있는 테이블 하나가 있습니다. 예를 들면 : [entry] 테이블은 두 명의 다른 학생에 대한 참조를 가질 수 있습니다. 다음은이에 대한 코드는 다음과 같습니다

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

+0

감사합니다. 나는 원래의 포스트를 편집하여 컨트롤러 코드를 포함하고 뷰 / – edgel1k

답변

1

두 번째 드롭 다운 목록에서 을 사용해야합니다.보기에서 StudentID을 두 번 사용하고 있습니다. 또한, 당신은 완전히 DropDownLists를 잘못 사용하고 있습니다. StudentID은 현재 학생 목록에있는 StudentID입니다. SelectListStudentID에 할당하지 마십시오. StudentList 또는 비슷한 이름의 Student 목록을 별도로 작성해야합니다.

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

아마도 DropDownListFor를 사용해야합니다.

1

코드 우선 (외래 키 관계가 데이터베이스 구조에서 가져 오지 않았으므로 ... 존재한다고 가정 함)를 사용하는 경우 두 개의 다른 필드가있는 엔터티가 있습니다. 둘 다 외래 키입니다 두 번째 엔티티에서 각 하위 객체와 함께 사용할 외부 키를 정의 할 수 있습니다. 데이터를 판별 할 수 없음을 저장하지하여 문제의 원인이 있는지 여부 있지만

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; } 
} 

: 당신은 아마에만이 두 학생 개체에 대해 수행하지만, 아래의 예는 외래 키 관계의 각각에 대해 수행해야합니다 물론.

0

이 엔티티 모델도 처음입니다. 그러나 나는 당신이 자기 참조라고 부르는 것을 생각하고 있습니다. 예를 들어 직원은 manager라는 필드를 가질 수 있습니다. 관리자가 직원이기 때문에 필드는 다시이 테이블의 직원 테이블에있는 테이블을 가리 킵니다. 이것은 그것을 구현하는 방법에 대한 아주 좋은 질문입니다. 어쩌면 기본 키와이 경우 관리자 필드에서 다른 데이터가없는 학생 테이블로 채울 수있는 외래 키를 사용하여 다른 테이블을 만들 수 있습니다. 허용되는 경우 1 : 1 관계를 설정합니다. 이 문제를 어떻게 해결하는지 알려주십시오.

또는 당신은 요청 와 학생 ID로 secondarly 학생 ID를 얻을 수 있고 다시 학생증

관련 문제