2012-02-13 33 views
0

我試圖創建一個自定義的MembershipUser,並且必須覆蓋GetUser()方法。不知道如何使用詞組:重寫教程中的方法

我下面這個教程:http://msdn.microsoft.com/en-us/library/ms366730.aspx

這裏是我有:

public override MembershipUser GetUser(string username, bool userIsOnline) 
    { 
     CustomMembershipConext db = new CustomMembershipConext(); 

     var user = db.User.Where(u => u.UserName == username).FirstOrDefault(); 

     if (userIsOnline) 
     { 
      user.LastActivityDate = DateTime.Now; 

     } 

     return user; 
     // Error 4 Cannot implicitly convert type 'MvcApplication1.Models.User' to 'System.Web.Security.MembershipUser' 

    } 
} 

我試圖複製此:

public override MembershipUser GetUser(string username, bool userIsOnline) 
{ 
    OdbcConnection conn = new OdbcConnection(connectionString); 
    OdbcCommand cmd = new OdbcCommand("SELECT PKID, Username, Email, PasswordQuestion," + 
     " Comment, IsApproved, IsLockedOut, CreationDate, LastLoginDate," + 
     " LastActivityDate, LastPasswordChangedDate, LastLockedOutDate," + 
     " IsSubscriber, CustomerID" + 
     " FROM Users WHERE Username = ? AND ApplicationName = ?", conn); 

    cmd.Parameters.Add("@Username", OdbcType.VarChar, 255).Value = username; 
    cmd.Parameters.Add("@ApplicationName", OdbcType.VarChar, 255).Value = pApplicationName; 

    OdbcMembershipUser u = null; 
    OdbcDataReader reader = null; 

    try 
    { 
    conn.Open(); 

    reader = cmd.ExecuteReader(); 

    if (reader.HasRows) 
    { 
     reader.Read(); 
     u = GetUserFromReader(reader); 

     if (userIsOnline) 
     { 
     OdbcCommand updateCmd = new OdbcCommand("UPDATE Users " + 
        "SET LastActivityDate = ? " + 
        "WHERE Username = ? AND Applicationname = ?", conn); 

     updateCmd.Parameters.Add("@LastActivityDate", OdbcType.DateTime).Value = DateTime.Now; 
     updateCmd.Parameters.Add("@Username", OdbcType.VarChar, 255).Value = username; 
     updateCmd.Parameters.Add("@ApplicationName", OdbcType.VarChar, 255).Value = pApplicationName; 

     updateCmd.ExecuteNonQuery(); 
     } 
    } 

    } 
    catch (OdbcException e) 
    { 
    if (WriteExceptionsToEventLog) 
    { 
     WriteToEventLog(e, "GetUser(String, Boolean)"); 

     throw new ProviderException(exceptionMessage); 
    } 
    else 
    { 
     throw e; 
    } 
    } 
    finally 
    { 
    if (reader != null) { reader.Close(); } 

    conn.Close(); 
    } 

    return u;  
} 
+1

不應該使用'='運算符而不是'=='?像'user.IsOnline = userIsOnline;' – Akhil 2012-02-13 19:37:10

+0

我認爲問題更大。我假裝從未真正同意的「user.IsOnline」。 – skhot 2012-02-13 19:38:47

+0

但你確實有一點! – skhot 2012-02-13 19:39:53

回答

1

用戶類型用戶的不,它仍然是一個IQueryable < ...>。您需要從查詢結果中提取用戶對象:

var user = db.User.Where(u => u.UserName == username).FirstOrDefault(); 
+0

這是非常有用的,所以如果我想從上面的tut複製代碼,我會這樣做:'公共覆蓋MembershipUser GetUser(字符串用戶名,布爾userIsOnline) { CustomMembershipConext db = new CustomMembershipConext(); var user = db.User.Where(u => u.UserName == username).FirstOrDefault(); if(userIsOnline) { user.LastActivityDate = DateTime.Now; } return user; } } **不能隱式地將類型'MvcApplication1.Models.User'轉換爲'System.Web.Security.MembershipUser ** – skhot 2012-02-13 20:03:06

+0

這是一個問題,還是您確認此解決方案適合您?如果可行,請隨時接受答案;) – 2012-02-13 20:12:13

+0

謝謝,這確實回答了較小的問題 - 更大的問題是如何從教程鏈接重寫該方法。我已經走了,接受你的答案。我不知道我的問題會如此加載。 – skhot 2012-02-13 20:14:42