Примеры, которые вы видите там, где контроллеры напрямую используют некоторую инфраструктуру доступа к данным, такую как Entity Framework, являются плохими примерами. Весь интернет загрязнен такими вещами. Я не могу смотреть на это, не повредив глаза. Я считаю это плохой практикой. Доступ к данным должен быть отделен и удален в хранилище. Так, например:
public interface IMoviesRepository
{
Movie Get(int id);
void Save(Movie movie);
}
тогда вы могли бы иметь некоторую реализацию этого интерфейса, используя обычный ADO.NET, EF, NHibernate, вызов удаленной веб-службы, некоторый пользовательский ORM или что-то еще:
public class MyCustomFrameworkMoviesRepository: IMoviesRepository
{
...
}
и контроллер примет этот интерфейс хранилища в качестве аргумента конструктора:
public class MoviesController: Controller
{
private readonly IMoviesRepository _repository;
public MoviesController(IMoviesRepository repository)
{
_repository = repository;
}
public ActionResult Index(int id)
{
var movie = _repository.Get(id);
return View(movie);
}
[HttpPost]
public ActionResult Index(Movie movie)
{
if (!ModelState.IsValid)
{
return View(movie);
}
_repository.Save(movie);
return RedirectToAction("Success");
}
}
и последняя часть заключается в настройке вашей структуры внедрения зависимостей для передачи правильной реализации хранилища в контроллер. Теперь, как вы видите, способ извлечения данных полностью отделен от логики контроллера. Так и должно быть. Всегда старайтесь избегать сильной связи между различными уровнями вашего приложения.
И чтобы ответить на ваш вопрос о государственной собственности: это нечто совершенно специфичное для EF, видеть что-то подобное в контроллере очень жаль.
И чтобы сделать это еще лучше и улучшить, вы бы представили модели представлений. Модели представлений - это классы, специально разработанные для удовлетворения требований данного представления. Так, например, Movie - это модель предметной области. Модели доменов никогда не должны передаваться напрямую в представления. Действия контроллера никогда не должны принимать доменные модели в качестве аргументов действия. Вы должны определить модели представления, которые будут содержать только то, что требуется для данного представления, а затем выполнить сопоставление между моделями представления и моделями домена. Такие фреймворки, как AutoMapper делают это очень простым.