Попытка отделить логику от контроллера в приложении MVC Entity Framework - Что здесь происходит? - PullRequest
0 голосов
/ 20 октября 2011

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

Это, однако, оставило проблему, которую я понимаю почему, но не как исправить.... И я не понимаю, почему он делает то, что делает.

В моем контроллере у меня было следующее:

public User GetCurrentUser()
{    
    User user = db.Users.SingleOrDefault(x => x.UserName == User.Identity.Name);
    return user;
}

Теперь я знаю о [NonAction], которыйустраняет проблему безопасности - однако я знаю, что это не следует передовым практикам, когда в контроллере нет никаких компонентов, не относящихся к контроллеру.По этой причине я перешел на новый класс и изменил его следующим образом:

public User GetCurrentUser(string name)
{    
    User user = db.Users.SingleOrDefault(x => x.UserName == name);
    return user;
}

У меня есть метод редактирования, который до этого просто устанавливал различные поля в пользовательском объекте, а затем вызывал db.SaveChanges().Это, однако, в настоящее время вызывает проблемы - я полагаю, что это происходит из-за вызова команды для объекта db, который на самом деле не загружен объект.

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

Я нахожу это очень запутанным!Что здесь происходит и где хранится объект?

И как мне это исправить?Я попытался сделать функцию БД нового класса общедоступной и вызвать ее метод SaveChanges(), но это приводит к той же самой проблеме - данным, которые не сохраняются в базе данных.

Во всяком случае, честно говоря, яМне действительно нравилось вызывать его через GetCurrentUser(), я хотел этого, потому что хотел изменить способ загрузки пользователя в будущем - но теперь, когда мне нужно вызвать его через GetCurrentUser(User.Identity.Name), и сделать другие изменения,Я думаю, что будет не намного сложнее просто пропустить метод и напрямую вызвать лямбда-запрос ... Кажется, это избавит вас от многих проблем.

Ответы [ 2 ]

1 голос
/ 20 октября 2011

Функции редактирования, которые я написал для моего приложения MVC, обычно содержат еще одну строку кода перед вызовом SaveChanges:

 _db.ApplyCurrentValues(OriginalEntity.EntityKey.EntitySetName, NewEntity);
 _db.SaveChanges();

Кроме того, возможно, я что-то упускаю, но не так (ниже) быть более простым способом обновления информации о пользователе в базе данных?

Membership.UpdateUser();

Что касается причины, по которой данные за пределами базы данных все еще отображаются для вас, я думаю , потому что когда вы вызываете GetCurrentUser, он кэширует информацию на стороне клиента.Я уверен, что кто-то с большим опытом здесь может дать более подробный (или более правильный ответ) по этой части.

1 голос
/ 20 октября 2011

Исходя из деталей вашего вопроса, вам необходимо убедиться, что вы присоединяете объект Entity, например, db.Users.Attach(updatedUser) А потом поменяй свое состояние например, db.ObjectStateManager.ChangeObjectState(updatedUser, EntityState.Modified)

Прежде чем позвонить db.SaveChanges()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...