現在、MVC 3アプリケーション内でデータを処理しています。 MVC 3とEntity Frameworkの両方でかなり新しくなっていますが、これはアプリケーション内のデータを処理するための最善の方法であるとは確信していません。実際、以下のUserExistsを呼び出す呼び出しは、完全にランダムであるように見えるSQLConnectionTimeoutの問題を発生させることがあります。私はSQLプロファイラを介して問題をトレースしようとしたが、接続がEF - > SQLから行われた直後にタイムアウトが発生するように見えます。MVC 3/EF/SQLの処理接続、廃棄、タイムアウト
私はこれについて別の質問で解決したと思っていましたが、バックアップがポップアップしたので、アプリケーションでデータ処理を試みる最善の方法であるかどうか、タイムアウトの問題を解決する可能性があります。 MVC 3/EF/SQL Server strange connection timeout issue
をだから私の質問(複数可)を要約する:それは場合に役立ちます。ここ
は、他の記事へのリンクである
- を許容下記のコードですか?
- 正常に動作するはずですか?
- 良い方法がありますか?
- EFからSQLへの不要な接続は開いたままになりますか? (SQLプロファイラは、使用しているステートメントが終了してからしばらく開いているように見えます)
- 私は他の記事に投稿したタイムアウトのアイデアはありますか?
注:リポジトリはIDisposableを実装し、以下に示すdisposeメソッドを持っています。リポジトリコンストラクタにエンティティコンテキストの新しいインスタンスを作成します。 (カスタムメンバシッププロバイダを使用してログオン)
コントローラー:
if (MembershipService.ValidateUser(model.UserName, model.Password))
{
User newUser = new User();
using (AccountRepository repo = new AccountRepository())
{
newUser = repo.GetUser(model.UserName);
...
}
}
メンバーシッププロバイダーのvalidateUser:
public override bool ValidateUser(string username, string password)
{
using (AccountRepository repo = new AccountRepository())
{
try
{
if (string.IsNullOrEmpty(password.Trim()) || string.IsNullOrEmpty(username.Trim()))
return false;
string hash = FormsAuthentication.HashPasswordForStoringInConfigFile(password.Trim(), "md5");
bool exists = false;
exists = repo.UserExists(username, hash);
return exists;
}catch{
return false;
}
}
}
GETUSER & UserExistsためのアカウントリポジトリ方法:
取得ユーザー:
public User GetUser(string userName)
{
try
{
return entities.Users.SingleOrDefault(user => user.UserName == userName);
}
catch (Exception Ex)
{
throw new Exception("An error occurred: " + Ex.Message);
}
}
ユーザーが存在する:
public bool UserExists(string userName, string userPassword)
{
if (userName == "" || userPassword == "")
throw new ArgumentException(InvalidUsernamePassword);
try
{
bool exists = (entities.Users.SingleOrDefault(u => u.UserName == userName && u.Password == userPassword) != null);
return exists;
}
catch (Exception Ex)
{
throw new Exception("An error occurred: " + Ex.Message);
}
}
リポジトリスニペット(コンストラクタ、廃棄など):
public class AccountRepository : IDisposable
{
private DbContext entities;
public AccountRepository()
{
entities = new DbContext();
}
...
public void Dispose()
{
entities.Dispose();
}
}
みんなありがとう - 私はこのことを実現あなたは巨大なウォールで9000人を超えるテキストのl!
あなたが開始し、デシベルコンテキストをdispoeのですか? – MikeSW
申し訳ありませんが、その情報を持つ投稿を編集しました。私はAccountRepositoryコンストラクタでエンティティコンテキストをインスタンス化し、Dispose()メソッドでそのコンテキストを破棄します。 – S9Designs