首页 > 解决方案 > 模型在 MVC 中究竟应该包含什么?

问题描述

我最近一直在阅读微软关于 ASP.NET Core 的教程,并看到该教程的控制器类包括 LINQ 查询以从数据库中获取数据。例如,该教程的代码片段如下所示:


// GET: Movies
public async Task<IActionResult> Index(string movieGenre, string searchString)
{
    // Use LINQ to get list of genres.
    IQueryable<string> genreQuery = from m in _context.Movie
                                    orderby m.Genre
                                    select m.Genre;

    var movies = from m in _context.Movie
                 select m;

    if (!string.IsNullOrEmpty(searchString))
    {
        movies = movies.Where(s => s.Title.Contains(searchString));
    }

    if (!string.IsNullOrEmpty(movieGenre))
    {
        movies = movies.Where(x => x.Genre == movieGenre);
    }

    var movieGenreVM = new MovieGenreViewModel
    {
        Genres = new SelectList(await genreQuery.Distinct().ToListAsync()),
        Movies = await movies.ToListAsync()
    };

    return View(movieGenreVM);
}

我的问题如下:模型类究竟包含什么?在我阅读的所有关于 MVC 模式的文章中,我被建议将我从数据库中获取数据的函数放入模型类中。那么他们在本教程中做错了吗?

标签: asp.net-coremodel-view-controllerasp.net-core-mvc

解决方案


模型类是 DTO,您可以在此处阅读有关它们的更多信息:https ://docs.microsoft.com/en-us/aspnet/web-api/overview/data/using-web-api-with-entity-framework /第 5 部分

您拥有的代码中没有错误,这只是一种不好的做法。实体和 DTO 之间的主要区别在于您没有提及与另一个 DTO 的关系。例如,当我们谈论我们拥有的实体时

public class Author{
public string name{get; set;}
public List<Book> Books {get; set;}
}

但是当我们谈论 DTO 时,我们将只有

public class Author{
    public string name{get; set;}
    }

代码将运行,但您不想获取实体的全部属性,只获取少数且显然不是与其相关的实体。如果您使用他们提供的版本,则代码将需要更多时间来编译并且容易出错。


推荐阅读