MVC4 C# Remplissage des données dans un viewmodel de la base de données
J'ai un viewmodel qui a besoin de données à partir de deux modèles de la personne et à l'adresse:
Modèles:
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public int Gender { get; set; }
}
public class Address
{
public int Id { get; set; }
public string Street { get; set; }
public int Zip { get; set; }
public int PersonId {get; set; }
}
Le Viewmodel est en tant que tel
public class PersonAddViewModel
{
public int Id { get; set; }
public string Name { get; set; }
public string Street { get; set; }
}
J'ai essayé plusieurs façons d'obtenir des données dans le viewmodel et passer à la vue. Il y aura plusieurs enregistrements retournés à l'écran.
Ma dernière méthode est de peupler le modèle de vue en tant que telle:
private AppContexts db = new AppContexts();
public ActionResult ListPeople()
{
var model = new PersonAddViewModel();
var people = db.Persons;
foreach(Person p in people)
{
Address address = db.Addresses.SingleOrDefault(a => a.PersonId == p.Id)
model.Id = p.Id;
model.Name = p.Name;
model.Street = address.Street;
}
return View(model.ToList());
}
J'obtiens une erreur sur l'Adresse adresse = db... ligne de "EntityCommandExecutionException a été gérée par le code de l'utilisateur.
Comment pouvez-vous remplir un modèle de vue avec plusieurs enregistrements et de passer à une vue de l'esprit?
Solution Finale:
private AppContexts db = new AppContexts();
private AppContexts dbt = new AppContexts();
public ActionResult ListPeople()
{
List<PersonAddViewModel> list = new List<PersonAddViewModel>();
var people = db.Persons;
foreach(Person p in people)
{
PersonAddViewModel model = new PersonAddViewModel();
Address address = dbt.Addresses.SingleOrDefault(a => a.PersonId == p.Id)
model.Id = p.Id;
model.Name = p.Name;
model.Street = address.Street;
}
return View(list);
}
Qu'est-ce que
S je suis en utilisant entity framework. db est le contexte.
Pourquoi n'utilisez-vous pas les propriétés de navigation?
Je ne suis pas exactement sûr de ce que tu veux dire par les propriétés de navigation? Je l'ai regardé et trouvé que ce serait quelque chose comme ceci dans mon cas public virtuel de Personne à Personne dans mon modèle?
donnez-nous les détails de l'exception?
db
dans ce cas? Et quel est le message de l'exception? Êtes-vous à l'aide de Entity Framework ou LinqToSql? Quelle que soit db
est semble avoir de la difficulté à l'exécution de la commande pour récupérer les données, mais sans plus d'info, il pourrait être n'importe quoi.S je suis en utilisant entity framework. db est le contexte.
Pourquoi n'utilisez-vous pas les propriétés de navigation?
Je ne suis pas exactement sûr de ce que tu veux dire par les propriétés de navigation? Je l'ai regardé et trouvé que ce serait quelque chose comme ceci dans mon cas public virtuel de Personne à Personne dans mon modèle?
donnez-nous les détails de l'exception?
OriginalL'auteur Xaxum | 2013-04-17
Vous devez vous connecter pour publier un commentaire.
D'abord, EntityCommandExecutionException erreurs indique une erreur dans la définition de votre entité contexte, ou les entités elles-mêmes. C'est la levée d'une exception, car elle est la base de données pour être différent de la façon dont vous lui avez dit qu'il devrait être. Vous avez besoin de comprendre ce problème.
Deuxièmement, concernant la bonne façon de le faire, le code que vous avez montré devrait fonctionner si votre contexte ont été correctement configuré. Mais, une meilleure approche serait d'utiliser la Navigation propriétés, aussi longtemps que vous le souhaitez pour obtenir tous les enregistrements liés et ne pas spécifier d'autres Où la clause de paramètres. Une de navigation de la propriété pourrait ressembler à ceci:
Alors vous dirais simplement:
.FirstOrDefault()
vous donnera seulement la première adresse dans la collection, même si elles seront toutes dans la collection. Mais depuis l'OP du code a.SingleOrDefault()
, je suppose que cela a été déjà prises en compte..FirstOrDefault()
est aussi meilleur que.SingleOrDefault()
, car "seul" est plus pour quand vous savez que vous ne recevrez qu'une seule réponse.Désolé encore une remarque: Pour obtenir que cela fonctionne pour moi, j'ai dû ajouter
.Include("Addresses")
à la fin dedb.Persons
avant la collecte de remplir. J'ai édité le post pour ajouter un commentaire sur ce sujet et la correction de nombreuses erreurs de syntaxe.OriginalL'auteur Erik Funkenbusch
Pour l'affichage des listes d'objets, vous pouvez utiliser une vue générique modèle qui dispose d'une liste générique:
Ont une action de contrôleur qui renvoie, disent tous les gens de votre base de données:
Alors d'avoir une vue fortement typée, en prenant dans votre vue générique modèle:
Vous devez créer une relation entre la Personne et l'Adresse, ça dépend de la portée de votre application, mais pour simplifier, disons que c'est un rapport de 1:1 c'est à dire une Personne a une Adresse. Ensuite, vous serez en mesure d'accéder à l'adresse d'une personne comme personne.Adresse.La ville etc. de votre point de vue. Voici un lien sur le Premier Code des associations weblogs.asp.net/manavi/archive/2011/01/23/...
Est-ce que @sylon, mentionné ci-dessus que les propriétés de navigation? J'ai un "un à plusieurs" de la relation, une personne peut avoir plusieurs adresses. Les clés étrangères ont été mis en place par entity framework, mais peut-être sans le virtuel je ne peux pas référence comme personne.Adresse.Ville.
Oui, vous devez spécifier les propriétés de navigation tel que décrit dans @sylons réponse.
Merci pour l'option. Cela l'a aidé à arriver là où je devais être.
OriginalL'auteur MattSull