J'ai quelques problèmes avec les relations entre ASP.NET MVC4 et CodeFirst, ainsi qu'avec les valeurs renvoyées par ces tables qui sont liées par une clé étrangère.
Tout d'abord, voyons si je le fais correctement.
Voici un exemple de mon code :
Classe de personnes
public class Person {
public int Id { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public City City { get; set; }
}
Classe de ville
public class City {
public int Id { get; set; }
public string Name { get; set; }
}
Ainsi, la base de données a créé une belle relation qui semble très bien fonctionner. Après ce code, j'ai des tables comme celles-ci :
Personne
--Id (PK)
--Nom
--Nom de famille
--Ville_Id (FK)
Ville
--Id (PK)
--Nom
Je l'ai alimenté avec une graine, voici un exemple :
context.Person.AddOrUpdate(p => p.Name,
new Person { Name = "Me", City = new City { Name = "Ludlow" } }
);
Et lorsque j'ai besoin de récupérer les informations dans une vue, comme ceci...
MyDataBase.cs
public class LeilaoDb : DbContext
{
public DbSet<Person> Persons { get; set; }
public DbSet<City> Cities { get; set; }
}
HomeController.cs
MyDataBase _db = new MyDataBase();
public ActionResult Index()
{
var model = _db.Persons.ToList();
return View(model);
}
Home/Index.cshtml
@model IEnumerable<testingproject.Models.Person>
@{
ViewBag.Title = "Home Page";
}
@foreach (var item in Model)
{
@Html.Partial( "_Person", item );
}
Personne.cshtml
@model testingproject.Models.Person
<div>
<h3>@Model.Name</h3>
@Model.City.Name
</div>
Je reçois une exception null...
Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.
Qu'est-ce qui ne va pas ?
Solution :
J'ai trouvé la solution,
MyDataBase _db = new MyDataBase();
public ActionResult Index()
{
var model = _db.Persons.ToList();
return View(model);
}
Ce code ne récupère que les personnes, peut-être pour ne pas surcharger lorsqu'il n'est pas nécessaire de faire des relations. Vous devez spécifier quand il est nécessaire d'établir ces relations avec un élément Include()
méthode.
Ensuite, c'est simple :
MyDataBase _db = new MyDataBase();
public ActionResult Index()
{
var model = _db.Persons.Include("City");
return View(model);
}
Je me sens bizarre de passer une chaîne de caractères à cette méthode, mais c'est bon. Je peux maintenant retourner mes valeurs avec @Model.City.Name
si j'en ai vraiment besoin.
J'ai trouvé la solution sur ce site aquí