2013-07-15 11 views
0

Travailler sur ma première application MVC. J'utilise la simple base de données d'appartenance fournie avec MVC4 pour gérer les utilisateurs et les rôles. Ma compréhension est que je dois faire trois étapes pour l'appel Find() ci-dessous pour travailler: obtenir l'adhésion simple GUID de la personne connectée, utilisez l'appartenance simple GUID pour obtenir l'ID dans ma base de données Couriers, puis utiliser cet ID comme paramètre manquant dans l'appel Find() ci-dessous pour retourner le modèle/enregistrement à modifier dans la vue?

Comment/quoi puis-je utiliser comme paramètre pour l'appel .Find()? Suis-je sur la bonne voie, ou est-ce que c'est beaucoup plus compliqué? Ps - J'enregistre l'appartenance GUID dans la base de données Couriers dans une colonne séparée de la colonne de la clé primaire Courier ID lorsque l'enregistrement Courier est créé. Je vous remercie.MVC4 Linq Database Call

public ActionResult EditCourier() 
    { 
     System.Web.Security.MembershipUser user = Membership.GetUser(); 
     var providerUserKey = user.ProviderUserKey; 
     Guid userId = (Guid)providerUserKey; 
     String userIDstring = userId.ToString(); 

     var model = 
      from c in db.Couriers 
      where c.CourierMembershipID == userIDstring 
      select c.ID; 

     Courier courier = db.Couriers.Find(); 

     if (courier == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(courier); 
    } 

Répondre

0

documentation MSDN dit:

Utilise la valeur de clé primaire pour tenter de trouver une entité suivi par le contexte . Si l'entité n'est pas dans le contexte, une requête sera exécutée et évaluée par rapport aux données de la source de données, et la valeur sera renvoyée si l'entité n'est pas trouvée dans le contexte ou dans la source de données .

Donc, si vous avez userId comme clé primaire dans le tableau Couriers vous pouvez utiliser .Find() comme ceci:

Courier courier = db.Couriers.Find(userId); 

Sinon, vous devez utiliser la requête standard LINQ, puis appelez .FirstOrDefault() ou SingleOrDefault() méthode:

Courier courier = db.Couriers.FirstOrDefault(c=>c.CourierMembershipID == userIDstring); 

EDIT:

I Suppos e vous obtenez cette erreur de requête suivante:

var model = 
      from c in db.Couriers 
      where c.CourierMembershipID == userIDstring 
      select c.ID; 

La raison est que vous obtenir de ce modèle de requête IEnumerable<Courier>. Pour faire cette requête pour obtenir seul objet Courier essayez d'appeler .FirstOrDefault() à la fin:

var model = (from c in db.Couriers 
       where c.CourierMembershipID == userIDstring 
       select c.ID).FirstOrDefault(); 
+0

Merci. J'ai un peu simplifié mon problème. Donc, s'il vous plaît laissez-moi le demander de cette façon. Je suis en train de retourner un seul enregistrement avec la requête linq retour à la vue, mais je reçois le ne peut pas convertir ienumberable en Courier message d'erreur –

+0

J'ai édité ma réponse –

+0

Merci beaucoup. L'utilisation de .First a été d'une grande aide pour aller de l'avant avec ce problème. Je vais aussi essayer le FirstOrDefault. –