Wpis z mikrobloga

#programowanie #csharp #aspnet #dotnet #entityframework
.NET 4.6 MVC

Mam problem ze zrozumieniem i załapaniem dobrej praktyki przy używaniu entity frameworka w dosyć podstawowej sytuacji. Mam dwa modele, Project i Note. Chciałbym, aby były one ze sobą w relacji jeden do wielu. Zastanawiam się jak to zrobić, żeby wycisnąć jak najwięcej z EF i nie pisać zbędnego kodu.

Tutaj definicje modeli: http://pastebin.com/Q05RfpgQ

Przede wszystkim chciałbym móc zamienić ProjectID na Project.Name podczas wyświetlania Note'sów. Podczas tworzenia poradziłem sobie w taki sposób:
Kontroler:

public ActionResult Create() {
ViewBag.Projects = db.Projects.ToList();
return View();
}

Widok:

@Html.DropDownListFor(model => model.ProjectID, new SelectList(ViewBag.Projects, "ProjectID", "Name"))
I to działa. Ale nie wiem jak w sensowny sposób zedytować np. widok Index(), żeby w tabeli zamiast ProjectID wyświetlał mi odpowiednią nazwę.

Zastanawiam się też jak w prosty sposób w Projects/Index dla każdego projektu wyświetlić listę powiązanych notatek.
  • 12
@Apokryf: Nie. Mam np. standardowy widok z tabelką wyświetlający obiekty Note. Obiekt Note ma ProjectID i tak też wyświetla się to pole w tabeli. Ja chciałbym mieć tam nazwę projektu o odpowiednim ID, a nie jego ID. Oraz w głównym widoku Projects chciałbym mieć kolumnę, w której będą wyszczególnione wszystkie powiązane Notes. I chcę to zrobić jak najlepiej wykorzystując możliwości EF.
@FedoraTyrone: Robiłem tak, ale miałem problem z tworzeniem Note wtedy, to znaczy z wybieraniem odpowiedniego projektu z DropDownList. Nie wiem jak zrobić DropDownList, który zwróci obiekt typu Projekt. Swoją drogą, czemu ta wartość ma być wirtualna?
@FedoraTyrone: Dzięki za pomoc. Z Twoimi wskazówkami poradziłem sobie z problemem :) A jeszcze małe pytanie, bo skończyło się na tym, że mam w modelu dwa pola:
public int ProjectId i nawigator public virtual Project Project; - wyczytałem gdzieś, że tak można robić i mi to uprościło sprawę. Czy jest to poprawna praktyka?

@WhirPool: Poradziłem sobie już raczej. Dzięki za chęć pomocy ale nie ma sensu, żebym jeszcze raz to
@Viters: To jest jak najbardziej poprawna praktyka. EF wykrywa, że Twoja właściwość ProjectId jest obcym kluczem. Jeżeli jest ona nullable to relacja jest opcjonalna. Jeżeli nie jest nullable to relacja jest wymagana i przy usuwaniu stosowane jest usuwanie kaskadowe. Wszystko ofc można nadpisać, ale taka jest konwencja. Masz linka jak coś: Akapit: Relationship Convention