私は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
でオブジェクトを取得できますUserDetails
this.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;
}
私が知っている最もクリーンな方法ではありません...