2009-12-04 6 views
0

J'ai une question difficile à poser alors s'il vous plaît bier avec moi.Exceptions et Linq aux Entités

Dans ce code ci-dessous, cela fonctionne car le programmeur souhaitait ne projeter que les erreurs spécifiques provoquées par la couche de données physique dans le journal des événements. Le reste est poussé plus loin dans la pile. C'est précisément parce qu'il est capable d'attraper OdbcException (s). J'applique mon propre MembershipProvider. J'utilise cependant Linq to Entities mais je souhaite envoyer uniquement les exceptions de bas niveau/niveau physique au journal des événements. Y a-t-il une exception que je peux attraper en utilisant Linq pour Entités qui me permettra d'attraper à ce niveau?

Comme vous pouvez le voir ci-dessous, même les exceptions lancées dans le bloc try ne seront pas interceptées et ne seront donc pas envoyées au journal des événements. Comment cela peut-il être fait avec Linq to Entities?

code:

public override string ResetPassword(string username, string answer) 
{ 
if (!EnablePasswordReset) 
{ 
    throw new NotSupportedException("Password reset is not enabled."); 
} 

if (answer == null && RequiresQuestionAndAnswer) 
{ 
    UpdateFailureCount(username, "passwordAnswer"); 

    throw new ProviderException("Password answer required for password reset."); 
} 

string newPassword = 
    System.Web.Security.Membership.GeneratePassword(newPasswordLength, MinRequiredNonAlphanumericCharacters); 


ValidatePasswordEventArgs args = 
    new ValidatePasswordEventArgs(username, newPassword, true); 

OnValidatingPassword(args); 

if (args.Cancel) 
    if (args.FailureInformation != null) 
    throw args.FailureInformation; 
    else 
    throw new MembershipPasswordException("Reset password canceled due to password validation failure."); 


OdbcConnection conn = new OdbcConnection(connectionString); 
OdbcCommand cmd = new OdbcCommand("SELECT PasswordAnswer, IsLockedOut 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; 

int rowsAffected = 0; 
string passwordAnswer = ""; 
OdbcDataReader reader = null; 

try 
{ 
    conn.Open(); 

    reader = cmd.ExecuteReader(CommandBehavior.SingleRow); 

    if (reader.HasRows) 
    { 
    reader.Read(); 

    if (reader.GetBoolean(1)) 
    throw new MembershipPasswordException("The supplied user is locked out."); 

    passwordAnswer = reader.GetString(0); 
    } 
    else 
    { 
    throw new MembershipPasswordException("The supplied user name is not found."); 
    } 

    if (RequiresQuestionAndAnswer && !CheckPassword(answer, passwordAnswer)) 
    { 
    UpdateFailureCount(username, "passwordAnswer"); 

    throw new MembershipPasswordException("Incorrect password answer."); 
    } 

    OdbcCommand updateCmd = new OdbcCommand("UPDATE Users " + 
    " SET Password = ?, LastPasswordChangedDate = ?" + 
    " WHERE Username = ? AND ApplicationName = ? AND IsLockedOut = False", conn); 

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

    rowsAffected = updateCmd.ExecuteNonQuery(); 
} 
catch (OdbcException e) 
{ 
    if (WriteExceptionsToEventLog) 
    { 
    WriteToEventLog(e, "ResetPassword"); 

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

if (rowsAffected > 0) 
{ 
    return newPassword; 
} 
else 
{ 
    throw new MembershipPasswordException("User not found, or user is locked out. Password not Reset."); 
} 
} 

Répondre

1

Je pense que je l'ai compris. Avec Linq to Entities vous pouvez attraper EntityException. Ce serait l'équivilent de OdbcException dans le code ci-dessus.

Merci à tous ceux qui ont passé du temps là-dessus.

Questions connexes