3 votes

Relation un-à-plusieurs dans ASP.NET MVC4 et CodeFirst

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í

1voto

Sornii Points 420

Le cadre des entités ne rend pas les relations inutiles. Si vous voulez inclure d'autres tables, vous devez appeler une méthode ou rendre les propriétés virtuelles pour créer une relation paresseuse.

public virtual City City { get; set; }

De cette manière, le mode paresseux est mis en place.

var model = _db.Persons.Include("City").ToList();

et cette méthode permet d'inclure manuellement les tables de liens lorsque cela est nécessaire.

Si vous souhaitez simplement appeler une personne sans la joindre, il vous suffit de l'appeler. _db.Persons.ToList();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X