2014-01-31 223 views
0

掙扎新手:(問題與登錄

實體沒有獲取用戶..

登錄控制器

[HttpPost] 
public ActionResult LoginForm(string user_NA, string user_pwd) 
{ 
    User u = new User(); 
    u.LogIn(user_NA, user_pwd); 
    return RedirectToAction("Index"); 
} 

登錄型號

public bool LogIn(string userID, string password) 
{ 
    using (Entity.xcLEntities en = new xcLEntities()) 
    { 
     try 
     { 
      var user = en.Users.SingleOrDefault(x => x.LoginID == userID && x.PasswordHash == this.SetPassword(password)); 
      if (user != null && password != null) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
     catch (Exception e) 
     { 
      throw e; 
     } 

    } 
} 

異常shoing

An exception of type 'System.NotSupportedException' occurred in AML.Web.dll but was not handled in user code 

Additional information: LINQ to Entities does not recognize the method 'System.String SetPassword(System.String)' method, and this method cannot be translated into a store expression. 
+0

如何使用ID獲取用戶? – JRU

+0

你確定用戶在那?如果你得到所有的用戶,你是否看到了用戶正在測試的'LoginID'? –

+0

@AndreiV你是否指一個實體? – JRU

回答

3

關於你例外,你可以嘗試獲得SingleOrDefault方法外的相應的散列:

public bool LogIn(string userID, string password) 
{ 
    using (Entity.AMLEntities en = new AMLEntities()) 
    { 
     try 
     { 
      string hashed = this.SetPassword(password); 
      var user = en.Users.SingleOrDefault(x => x.LoginID == userID && x.PasswordHash == hashed); 
      if (user != null && password != null) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
     catch (Exception e) 
     { 
      throw e; 
     } 

    } 
} 

編輯:由於在評論中所建議的Rezoan的更多信息,可以通過閱讀Entity Framework can't run your C# code as part of its query發現。

+0

非常感謝,如果你讓我知道爲什麼它不被我的代碼接受:) – JRU

+1

我不是lambda表達式的專家,但它可能與事實有關,在你的lambda表達式中,有另一個「實例」,即關鍵字「this」不是指您的「用戶」實例。也許有人可以提供更好的解釋。 –

+1

@JRU實體框架不能實際運行您的C#代碼作爲其查詢的一部分。看到StriplingWarrior的答案http://stackoverflow.com/questions/7259567/linq-to-entities-does-not-recognize-the-method – Rezoan

0

您應該將SetPassword方法的結果存儲在本地varoable中,並在lambda表達式中使用varoable。異常很明顯,setpassword方法在數據庫端不可用。