1

私はMVC3プロジェクトにベースコントローラーを実装して、dbコンテキストからユーザーエンティティにアクセスする一般的な方法を可能にしました。

public abstract class MyBaseController : Controller
{
    protected DBEntitiesContainer db;

    protected override void Initialize(System.Web.Routing.RequestContext requestContext)
    {
        base.Initialize(requestContext);
        this.db = new DBEntitiesContainer();
    }

    public UserDetails GetActiveUserDetails()
    {
        UserDetails userDetails = GetObjects.GetActiveUserDetails(this.db);
        return userDetails;
    }
}

これはうまく機能し、すべてのコントローラーがオブジェクトにアクセスし、呼び出すことthis.db.MyEntityでオブジェクトを取得できますUserDetailsthis.GetActiveUserDetails()

ただし、エンティティに対して更新を実行しようとすると、問題が発生します。

public class UpdateController : MyBaseController
{
  public ActionResult Index()
  {
    UserDetails userDetails = this.GetActiveUserDetails();    
    userDetails.LastOnline = DateTime.Now;
    UpdateModel(userDetails);
    this.db.SaveChanges();
  }
}

UserDetailsオブジェクトを簡単に取得できる理由はありますが、呼び出した後にデータベースを確認してSaveChanges()も、何も更新されていませんか?私は2つの異なる方法で自分のコンテキストにアクセスしていると思いますが、自分がどのようになっているかわかりません...!

編集:これがGetObjects.GetActiveUserDetails()メソッドです

public static UserDetails GetActiveUserDetails(DBEntitiesContainer db)
{
  MembershipUser membershipUser = Membership.GetUser();    
  UserDetails userDetails;

  try
  {
    if (membershipUser != null)
    {
      userDetails = (from u in db.UserDetails
                     where (u.UserId == (System.Guid)membershipUser.ProviderUserKey)
                     select u).First();
    }
    else
    {
      return GetGuestAccount();
    }
  }
  catch
  {
    return GetGuestAccount();
  }

  return userDetails;
}

私が知っている最もクリーンな方法ではありません...

4

2 に答える 2

1

UpdateModel は Controller 基底クラスのヘルパー メソッドです。HttpPost アクションメソッド中に受信フォームパラメーターを使用して渡すオブジェクトのプロパティの更新をサポートします。

reffection を使用してオブジェクト (渡されたモデル オブジェクト) のプロパティ名を見つけ、フォーム (クライアント フォーム) によって送信された入力値に基づいて割り当て値をそれらに自動的に変換します。

あなたの場合、モデルの更新を使用すると、入力値がなく、関連するモデルが見つかり、データベースにあるモデルのデフォルト値が作成されます。

updatemodel 行にコメントを付けて、コードを実行してみてください...動作するはずです。

于 2012-03-23T17:02:44.497 に答える
0

この方法でデータ アクセスを設定することはお勧めできません。理由の 1 つは、使用後に db コンテキストを破棄する必要があることです。これは、メソッドを使用すると、ガベージ コレクションが発生するまでデータベース接続を開いたままにすることを意味します。ガベージ コレクションは数分または数時間後になる可能性があります。他の Web 要求が着信すると、新しいデータベース接続が作成され、それらも破棄されません..など..など..これは疑似メモリ リークです (最終的には収集されるため、真のメモリ リークではありませんが、リソースが必要になった後に十分に使用されていることを意味します)

于 2012-02-13T22:38:02.303 に答える