没有实体框架的asp.net mvc

sar*_*ake 13 asp.net-mvc modelstate

我正在学习asp.net mvc,并经历了一个很好的教程,证明了它.该教程还使用了Entity Framework.

我们有自己的数据访问类,我必须使用它.关于我们需要做什么来弥合我们的类和MVC框架之间的差距,我有点困惑.例如,在教程中,在MovieController.cs文件中,有一个Edit方法,如下所示:

[HttpPost]
        public ActionResult Edit(Movie movie)
        {
            if (ModelState.IsValid)
            {
                db.Entry(movie).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(movie);
        }
Run Code Online (Sandbox Code Playgroud)

如果我不使用Entity框架,它会是什么样子?我是否仍然需要使用ModelState.IsValid并像完成一样保存状态

db.Entry(movie).State = EntityState.Modified;
Run Code Online (Sandbox Code Playgroud)

请指教.一个明确的使用asp.net mvc而不使用Entity框架的例子会很棒.

我需要知道的是,状态在这里扮演什么角色,是否强制使用,或者它只是实体框架运作的一部分.

我会把它重写为:

[HttpPost]
public ActionResult Edit(Movie movie)
{
    myDBObject.SaveChanges();
    return RedirectToAction("Index");

}
Run Code Online (Sandbox Code Playgroud)

myDBObject是我的自定义数据库访问对象.

Dar*_*rov 22

您可以看到控制器直接使用某些数据访问框架(如Entity Framework)的示例是不好的示例.整个互联网都被这些东西污染了.没有眼睛受伤我几乎看不到它.我认为那些是不好的做法.应在存储库中分离和抽象数据访问.例如:

public interface IMoviesRepository
{
    Movie Get(int id);
    void Save(Movie movie);
}
Run Code Online (Sandbox Code Playgroud)

那么你可以使用普通的ADO.NET,EF,NHibernate,远程Web服务调用,一些自定义ORM或者其他任何东西来实现这个接口的一些实现:

public class MyCustomFrameworkMoviesRepository: IMoviesRepository
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

并且控制器将此存储库接口作为构造函数参数:

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

最后一部分是配置依赖注入框架,以将存储库的正确实现传递给控制器​​.现在您可以看到获取数据的方式与控制器逻辑完全分离.这是应该的方式.始终尽量避免应用程序的不同层之间的强耦合.

并回答你关于State属性的问题:这是EF完全特定的东西,在控制器中看到这样的东西是非常可惜的.

为了进一步提高它并进行改进,您将介绍视图模型.视图模型是专门为满足给定视图的要求而设计的类.例如,Movie是一个域模型.域模型永远不应该直接传递给视图.控制器动作绝不应将域模型作为动作参数.您应该定义视图模型,该模型仅包含给定视图所需的内容,然后执行视图模型和域模型之间的映射.AutoMapper等框架使这一点变得非常简单.

  • 虽然我同意它们是不好的做法,但有时候不能构建抽象UnitOfWork/Repository模式可能是实用的.专业开发人员将遵循允许安全性,可伸缩性和可测试性的模式......对公司IT人员或业余爱好者的需求可能无法证明这一点. (2认同)