2016-08-03 15 views
1

Ich habe versucht, Daten aus meiner Tabelle mit Entity-Framework mit Hilfe von abrufen. Der Controller-Code wird wie folgt dar:FirstOrDefault gibt keine passende Antwort

public ActionResult getUser(MembershipModel model) 
{ 
    ProviderImplementation.Edmx.ProviderEntities providerEntities = new ProviderImplementation.Edmx.ProviderEntities(); 
    //var membershipModel = new MembershipModel(); 
    //var model = ProviderImplementation.Models.MembershipModel; 
    //bool isUserOnline = true; 
    if (!ModelState.IsValid) 
    { 
     var isValid = Membership.GetUser(model.UserName, true); 
     if (isValid != null) 
     { 
      var rowData = providerEntities.Users.Where(u => u.UserName.Equals(model.UserName)).FirstOrDefault(); 
      model.UserName = rowData.UserName; 
      model.Password = rowData.Password; 
      model.UserId = Convert.ToInt32(rowData.UserId); 
      model.RoleId = Convert.ToInt32(rowData.RoleId); 
      //var singleValue = providerEntities.Users.Find(model.UserName); 
      ViewBag.User = "Found"; 
     } 
     else 
     { 
      ViewBag.User = "Not Found"; 
     } 
    } 
    else 
    { 
     var error = ModelState.Values.SelectMany(v => v.Errors); 
     ModelState.AddModelError("NoModelError", error.ToString()); 
    } 
    return View(model); 
    } 

Auch meine Tabellendaten sind wie folgt: Tabellenname: User

Table containing Table data and columns

Jetzt habe ich versucht, so viele Dinge, die es druckt auch die Daten im Blick mit dem ausgewählten spezifischen Datensatz.

Das Problem ist hier:
{Adaequat} -> 1. Wenn ich den Rekord mit Benutzername „abbas“ holen, wie es zunächst wird mit Benutzer-ID = 2 angetroffen wird es auch in der Ansicht Ansicht Code gedruckt ist :

<div style="margin-left: 200px;"> 
    <table cellpadding="10" cellspacing="10"> 
     <tr> 
      <th>Get User Details</th> 
     </tr> 
     <tr> 
      <th>@ViewBag.User</th> 
     </tr> 
     <tr> 
      <td>@Html.LabelFor(m => m.UserId)</td> 
      <td>@Html.LabelFor(m => m.UserName)</td> 
      <td>@Html.LabelFor(m => m.Password)</td> 
      <td>@Html.LabelFor(m => m.RoleId)</td> 
     </tr> 
     <tr> 
      <td>@Html.DisplayFor(Model=>Model.UserId)</td> 
      <td>@Html.DisplayFor(Model=>Model.UserName)</td> 
      <td>@Html.DisplayFor(Model=>Model.Password)</td> 
      <td>@Html.DisplayFor(Model=>Model.RoleId)</td> 
     </tr> 
    </table> 
</div> 

{Problem} -> 2. Wenn ich den Rekord mit Benutzername „Abbas“ holen UserId mit = 4 dann FirstOrDefault druckt die obigen Daten von Username = „abbas“ als erstes angetroffen und Username nicht gedruckt = "Abbas" in Ansicht.

Hinweis: SingleOrDefault gibt eine Ausnahme zurück, die besagt, dass mehr als eine Instanz gefunden wurde.

Update: Während des Debuggens, wenn ich die Werte ändere, druckt es perfekt aus der Datenbank.

+1

was ist die Frage? –

+0

Bitte lesen Sie http://StackOverflow.com/Help/how-to-ask und bearbeiten Sie dann die Frage – MikeT

+0

ok ich werde es lesen und versuchen, es nach Bedarf zu bearbeiten. –

Antwort

0

Ich stimme den vorherigen Antworten zu, Sie sollten kein System haben, das zwischen Benutzernamen basierend auf Groß-/Kleinschreibung unterscheidet. Dies ist ein Zeichen dafür, dass Ihre Struktur schlecht entworfen ist, daher würde ich vorschlagen, Ihr System zu ändern. Ich kann zum Beispiel sehen, dass Sie in derselben Tabelle wie die Benutzertabelle eine Role-ID haben. Wenn Sie mehrere Logins in dieser Tabelle mit unterschiedlicher Groß-/Kleinschreibung erstellen, um verschiedene Rollen für die gleiche Person zu bewältigen, gibt es viel bessere Möglichkeiten Dies wird Ihnen auf lange Sicht viel weniger Kummer bereiten.

Wenn Sie jedoch für Groß- und Kleinschreibung überprüfen möchten, dann versuchen:

var rowData = providerEntities.Users.FirstOrDefault(u => u.UserName == model.UserName && String.Compare(u.UserName, model.UserName,false) == 0); 

Sie können auch die folgende (DB-Abfrage) versuchen:

var rowData = db.Users.ToList().Where(x => (string.Compare(x.UserName, model.UserName, false) == 0)).FirstOrDefault(); 

Dies setzt voraus, Ihre Benutzerklasse ist ' Benutzer '.

+0

Ich werde nur versuchen und Sie das Ergebnis wissen lassen. Ja, ich akzeptiere den Rat zum Entwerfen der richtigen Tabellenstruktur und werde es ab sofort für andere Tabellen und auch in anderen Projekten implementieren. –

+0

Nein, es funktioniert nicht wie erwartet. String-Vergleich funktioniert nicht –

+0

Ich denke, es funktioniert nicht, weil es die Datenbank direkt abfragt und eine SQL-Tabelle die Groß-/Kleinschreibung nicht standardmäßig bestätigt. Also habe ich meine Antwort mit einer anderen möglichen Lösung aktualisiert, die einen Anruf verwendet, der direkt die Datenbank abfragt. Versuche es. – Rob

0

Die SQL-Abfrage hinter der EF unterscheidet nicht "abbas"/"Abbas". Führen Sie SQL Profiler aus, und sehen Sie sich die Abfrage an, die beim Aufruf ausgeführt wird.

+0

Können Sie mir ein wenig über sql profiler geben. Ich möchte wissen, –

+0

Ich nehme an, dass Ihre Datenbank in SQL Server gehostet wird. Wenn Ihre Datenbank auf dem SQL-Server gehostet wird, stellt Microsoft SSMS die Funktion "SQL Profiler" bereit, mit der alle auf Ihre Datenbank ausgerichteten Abfragen verfolgt werden können. Bitte gehen Sie durch https://msdn.microsoft.com/en-in/library/ff650699.aspx –

+0

Ok danke für solch einen hilfreichen Tipp. –

0

Zuerst sollten Sie die Idee der doppelten Einträge für den Benutzernamen löschen. Dies sollte das grundlegende Problem lösen, mit dem Sie konfrontiert sind, und ist die beste Vorgehensweise für das Speichern von Benutzerkonten.

Wenn Sie darauf bestehen, dass der Benutzername dupliziert werden kann, führen Sie die FirstOrDefault mit einer Groß-und Kleinschreibung suchen. Können Sie das Code-Snippet ausprobieren?

var rowData = providerEntities.Users.FirstOrDefault(u => u.UserName.Equals(model.UserName)); 
+0

Es funktioniert nicht. FirstOrDefault unterscheidet immer noch nicht zwischen "abbas" & "Abbas" .. uhhgg ich stecke !! ... Aber die Idee von FirstOrDefault mit Groß-und Kleinschreibung ist gut genug. –