Ich verwende zwei LINQ-Abfragen für den Zugriff auf meine Datenbank mit Entity Framework:
Die erste speichert ein Token in der Datenbank und gibt ihm eine Zeitspanne von 60 Sekunden:
string tokenHash = GetTokenHash();
Token token = new Token()
{
Client = client,
Expiry = DateTime.Now.AddSeconds(60),
UserId = userId,
TokenHash = tokenHash,
};
context.AddToToken(token);
context.SaveChanges();
Der zweite sucht nach einem passenden Token, das noch nicht abgelaufen ist:
var item = (from t in datasource.SmsToken
where t.Client.Id == clientId
&& t.UserId == userId
&& t.TokenHash == tokenHash
&& t.Expiry > DateTime.Now
select t);
bool success = item.Count() >= 1;
Das Problem, das ich habe, ist, dass dies auf einem Testserver perfekt funktioniert hat. Jetzt, wo es auf eine andere Umgebung verschoben wurde, funktioniert es nicht mehr.
Ich habe eine Menge von Debug-Informationen und alles scheint zu entsprechen. Wenn ich die t.Expiry > DateTime.Now
Zustand, funktioniert es gut. Das Problem liegt also im Datumsvergleich.
Der neue Server wurde mit einem anderen Datumsformat und anderen Globalisierungseinstellungen in Windows eingerichtet. Ich nehme an, dass dies das Problem ist, und das verwirrt mich.
Ich hätte gedacht, dass die Daten mithilfe von LINQ und EF konsistent gespeichert und abgerufen werden würden. Ich sollte damit keine Formatierungsprobleme haben, oder? Kann mir jemand sagen, was hier schief läuft?
Aktualisierung:
Interessanterweise erhalte ich das richtige Verhalten, wenn ich den Abrufcode durch den folgenden ersetze:
var item = (from t in datasource.SmsToken
where t.Client.Id == clientId
&& t.UserId == userId
// && t.TokenHash == tokenHash
// && t.Expiry > DateTime.Now
select t).ToList();
var matchingToken = (from t in item
where t.TokenHash == tokenHash
&& t.Expiry > DateTime.Now
select t).FirstOrDefault();
bool success = matchingToken != null;
Das deutet für mich darauf hin, dass das Problem mit Datumsvergleichen innerhalb von Linq-to-Entities zu tun hat. Linq-to-objects funktioniert einwandfrei!