Autor Beitrag
Elma
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Sa 17.12.11 23:19 
Hallo alle miteinander :)

Ich suche schon seit Stunden nach einer Lösung für mein Problem, aber irgendwie finde ich keins...
Ich hoffe Ihr könnt mir weiterhelfen :)
Und zwar hab ich in einer Datenbank 2 Unterschiedliche Tabellen, einmal Lehrer und einmal Schüler und ich möchte beide Tabellen nach email-adresse prüfen, also sodass das System sofort weiss, wenn der Lehrer sich einloggt und wann der Schüler, wenn beide einzeln darstehen, dann funzt es, aber soald ich beide Tabellen aktiviere, geht es nicht mehr :(
Ich poste euch mal den fehlerhaften Schnipsel-Code und hoffe einer kann mir helfen :(
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
public ActionResult LogOn(BenutzerViewModel model)
{
    if (string.IsNullOrEmpty(model.EMail) || string.IsNullOrEmpty(model.Password))
         return View();

//Hier werden mir die Fehler angezeigt, weiss nicht, ob ich beide datenbanken joinen muss??           

    Lehrer lehrer = NHibernateSession.QueryOver<Lehrer>().Where(x => x.EMail == model.EMail).List().ToList().First();
    Schueler schueler = NHibernateSession.QueryOver<Schueler>().Where(x => x.EMail == model.EMail).List().ToList().First();

    if (model.EMail == schueler.EMail &&  model.Password == schueler.Password)
    {
        FormsAuthentication.SetAuthCookie(model.EMail, false); 
            return RedirectToAction("Index""Schueler");
    }


Ganz liebe Grüße

Elma

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: Titel geändert.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 18.12.11 11:45 
Hallo und :welcome:

es wäre schön, wenn du die Fehlermeldung auch posten würdest (da nicht jeder Hibernate sowie deinen DB-Tabellen auf seinem System hat, um das nachzustellen ;-))

Erstens sieht mir dein Linq-Ausdruck etwas zu kompliziert aus (List().ToList().First()) und zweitens liefert First() eine InvalidOperationException (diese Fehlermeldung meinst du wahrscheinlich?), wenn die Sequenz (Liste) leer ist.

Zur Abhilfe kannst du FirstOrDefault() benutzen. Danach mußt du dann aber auf 'null' jeweils testen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
Lehrer lehrer = NHibernateSession.QueryOver<Lehrer>().Where(x => x.EMail == model.EMail).FirstOrDefault();
if (lehrer != null)
{
  // ...
}


P.S: Ich habe mal den Titel angepaßt, da du ja zwei Tabellen zusammen benutzen willst und nicht zwei Datenbanken ;-)
Elma Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: So 18.12.11 11:55 
Halliiiii Hallooooo :)

vorerst einmal vielen lieben Dank für deine schnelle Rückmeldung :)
Genau das InvalidException ist meine Fehlermeldung :)
zu dem FirstorDefault, da gibs folgendes Problem, dass ich nicht auf null testen kann, da ich ja prüfen will, ob mein eingegebenes Passwort== das richtige Passwort ist :(

Danke für deine Hilfe :)

Moderiert von user profile iconTh69: Beiträge zusammengefasst

Ps: Und danke auch für die Namensänderung^^

Ich habs auch mit dem FirstOrDefault versucht, aber leider erhalt ich diesmal an einer anderen Stelle die InvalidOptionException und zwar an dieser:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
if (model.EMail == schueler.EMail && schueler.Password == model.Password)
{
    FormsAuthentication.SetAuthCookie(model.EMail, false); 
       return RedirectToAction("Index""Schueler");
}

Ich hab auch mit dem !=null getestet, aber das mag auch nicht klappen :(
Ich versteh einfach nicht, wieso wenn ich nur eine Liste durchgehen möchte, alles einwandfrei funktioniert und er mir diese Tabelle duchgeht, sobald eine zweite Tabelle mit im Spiel ist, ich eine Fehlermeldung kriege :(

Hoffe, ich konnte mich verständlich ausdrücken :(

Ganz liebe Grüße,
Elma

Moderiert von user profile iconTh69: C#-Tags hinzugefügt: bitte demnächst selber unter "Bereiche" die Tags setzen, danke!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 18.12.11 12:23 
Hallo Elma,

du brauchst (darfst) doch nur die Passwort-Abfrage durchführen, wenn überhaupt ein Lehrer (mit der E-Mail) gefunden wurde (und das gleiche dann analog beim Schüler).

Ich will dir jetzt eigentlich nicht die Komplettlösung hinschreiben, aber du brauchst einfach nur die if-Abfragen zu kombinieren.

Am besten, du führst eine 'bool'-Variable ein:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
bool authenticated = false;

Lehrer lehrer = ...;
if (lehrer != null)
  if (model.EMail == lehrer.EMail && model.Password == lehrer.Password)
    authenticated = true;    

// gleiche für Schüler
// ...

if (authenticated)
{
  // ...
}


Und wenn du die Passwort-Abfrage sogar noch jeweils direkt in die Where-Methode einbaust, dann reduziert sich deine Abfrage zu
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
Lehrer lehrer = ...;
Schueler schueler = ...;
if (lehrer != null || schueler != null)
{
  // authenticated!!!
}


P.S.: Ich nehme mal an, daß dies nur eine Testdatenbank ist, denn in Echtsystemen dürfen niemals Passwörter unverschlüsselt abgelegt werden (nur Sony macht so etwas :mrgreen: ), sondern am besten immer mit Salt+Hash (auch wenn dir das jetzt wahrscheinlich noch nichts sagen wird...)
Elma Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: So 18.12.11 14:21 
hehe ja keine Angst ist nur ne Testdatenbank :D
Bin grad dabei MVC- C# zu erlernen, und soweit bin ich eigentlich auch ganz gut klar gekommen, aber irgendwie wollte dieser Part nicht :(

Zeile 57: if(schueler!= null || lehrer !=null)
Zeile 58: if (model.EMail == schueler.EMail && schueler.Password == model.Password)

genau hier gibt es die Fehlermeldung :(
Vllt liegts auch daran, dass der Lehrer nochmal in mehreren Kategorien untergeordnet wird, und diese auch mit elseif durchgegangen werden, daran dürfte es aber nicht liegen, weil das system erst garnicht so weit geht.
Hab erstmal versucht die von dir genannte If- Anweisung getrennt durchzugehen, aber da es sich um eine 5-fach verschachtelte If-Anweisung handelt, hats nicht wirklich funktioniert :(

Danke nochmal und sorry, dass ich gerade etwas aufm Schlauch hänge :( Beschäftige mich seit gestern Vormittag damit, hab so viel ausprobiert, ich glaub ich tanz nurnoch ein Freudentanz, wenn es endlich klappt^^
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 18.12.11 14:38 
Hallo Elma,

hast du meinen Beitrag genau gelesen?

Überlege dir mal bei deinem Code, was passiert wenn 'schueler = null' ist.

Ich habe ein bißchen den Eindruck, dir fehlen ein paar Grundlagen der Programmierung. Ist denn C# deine erste Programmiersprache?
Und den Umgang mit dem Debugger solltest du auch lernen, um solche (einfachen) Fehler selber zu finden und zu beseitigen.

Vllt. ist dann der Umgang mit Datenbanken, O/R-Mappern, Linq, etc. z:Z. noch ein zu hoch gestecktes Ziel für dich?