ASP MVC 3 Базовый контроллер для доступа к контексту объекта - PullRequest
1 голос
/ 14 февраля 2012

Я реализовал базовый контроллер для своего проекта MVC 3, чтобы разрешить общий способ доступа к пользовательской сущности из моего контекста БД:

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(), ничего не обновляется?Я предполагаю, что я получаю доступ к своему контексту двумя различными способами, но я не могу видеть, как я ...!

Редактировать: вот метод 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;
}

Не самый чистый метод, который я знаю ...

Ответы [ 2 ]

1 голос
/ 23 марта 2012

UpdateModel - вспомогательный метод для базового класса контроллера. он поддерживает обновление свойств объекта, который мы передаем, используя входящие параметры формы во время метода действия HttpPost.

Он использует Relfection, чтобы узнать имена свойств объекта (объект модели, который мы передали), а затем автоматически преобразует присваиваемые им значения на основе входных значений, представленных формой (форма клиента).

В вашем случае, когда вы используете модель обновления, у нее нет входного значения, вы находите связанную модель и задаете значения модели по умолчанию, как в базе данных.

попытайтесь прокомментировать строку updatemodel и запустите код ... он должен работать.

0 голосов
/ 14 февраля 2012

Не стоит настраивать доступ к данным таким образом.Одна из причин заключается в том, что вы должны избавиться от контекста БД после его использования.Это означает, что при использовании вашего метода соединение с базой данных остается открытым до тех пор, пока не произойдет сборка мусора, что может произойти через несколько минут или часов.Когда поступают другие веб-запросы, создаются новые подключения к базе данных, и опять-таки они не удаляются ни ... и т.д ... и т.д ... это утечка псевдопамяти (не настоящая утечка памяти, потому что она в конечном итоге будет собрана, ноозначает, что ресурсы используются хорошо после того, как они необходимы)

...