Dodawanie powiązania z innym obiektem za pomocą DropDownList

0

Witam.
Mam problem z dodaniem pracownika do harmonogramu zajęć. Nie wiem jak do końca to zrobić.
Postaram się wytłumaczyć co próbowałem zrobić.
Model Person.cs

 public abstract class Person
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int PersonId { get; set; }

        public long Pesel { get; set; }

        public string FirstName { get; set; }

        public string LastName { get; set; }

        public string Email { get; set; }

        public DateTime DateOfBirth { get; set; }


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

    }

Model Employee.cs

  public class Employee : Person
    {
        public Employee()
        {
            EmployeeSchedule = new HashSet<EmployeeSchedule>();
        }

        public int Salary { get; set; }

        public DateTime Hiredate { get; set; }

        public bool isManager { get; set; }

        public virtual ICollection<EmployeeSchedule> EmployeeSchedule { get; set; }

    }

model EmployeeSchedule.cs

 public class EmployeeSchedule
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int EmployeeScheduleId { get; set; }
        //Table: Godziny_prac
        public DateTime StartTime  { get; set; }
        public DateTime EndTime { get; set; }
        public string DayOfWeek  { get; set; }

        [Required]
        public virtual Employee Employee { get; set; }

        [NotMapped]
        [Display(Name = "Pracownik")]
        public string EmployeeIN
        {
            get
            {
                DbContext db = new DbContext();
                try
                {
                    var k = db.Employee.Find(Employee);
                    return k.FullName;
                }
                catch { return ""; }
            }
        }
    }

Przy tworzeniu harmonogramu pracy(EmployeeSchedule) chcę z DropDownList wybrać konkretnego pracownika i dodać to powiązanie do bazy. Lista wyświetla się prawidłowo.

EmployeeScheduleController.cs

public ActionResult Create()
        {
            ViewBag.PersonId = new SelectList(db.Employee, "PersonId", "FullName");
            return View();
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = "EmployeeScheduleId,StartTime,EndTime,DayOfWeek")] EmployeeSchedule employeeSchedule)
        {
            ViewBag.PersonId = new SelectList(db.Employee, "PersonId", "FullName");
            ViewData["DayOfWeek"] = new SelectList(selectDays, "Key", "Value");

            if (ModelState.IsValid)
            {
                Employee employee = db.Employee.Find(employeeSchedule.Employee);
                employee.EmployeeSchedule.Add(employeeSchedule);
                db.EmployeeSchedule.Add(employeeSchedule);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(employeeSchedule);
        }

Create.cshtml

  <div class="form-group">
            @Html.LabelFor(model => model.Employee.PersonId, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
               @Html.DropDownList("PersonId", String.Empty)
                @Html.ValidationMessageFor(model => model.Employee.PersonId, "", new { @class = "text-danger" })
            </div>
        </div>

Jak sprawdzam debuggerem to wychodzi, że problem tkwi właśnie w przypisaniu pracownika. Wartość employee równa się null. Gdzie robię żle?

1

Zamiast dropDownLista spróbuj dropDownListFor ze wskazaniem modelu, do którego chcesz przypisać.

http://stackoverflow.com/questions/21239177/mvc-4-populate-dropdownlistfor-with-model-list

1

Poza tym, że nie wiążesz w żaden sposób wartości z dropdowna z polem modelu, to czym jest to:

 
        [NotMapped]
        [Display(Name = "Pracownik")]
        public string EmployeeIN
        {
            get
            {
                DbContext db = new DbContext();
                try
                {
                    var k = db.Employee.Find(Employee);
                    return k.FullName;
                }
                catch { return ""; }
            }
        }
    }

Tworzysz kontekst EF wewnątrz właściwości jakiegoś modelu?! Czyli niepotrzebnie tworzysz ogromne obiekty, tworzysz je wielokrotnie zupełnie niepotrzebnie, tworzysz je w złym miejscu, to jeszcze wystarczyłoby po prostu: return Employee.FullName;.

1 użytkowników online, w tym zalogowanych: 0, gości: 1