Asp.net mvc asp.net中的mvc不能满足程序员的要求

Asp.net mvc asp.net中的mvc不能满足程序员的要求,asp.net-mvc,entity-framework,asp.net-mvc-4,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,我正在Visual Studio中学习MVC4,对此我有很多问题。我对MVC的第一句话是MVC的模型没有达到我的预期。我希望模型根据需要选择并返回数据行 但我读了很多教程,他们建议我让模型返回表中的所有数据,然后删除控制器中不需要的数据,然后将其发送到视图 以下是教程中的代码 模型 这是对select语句应用“where子句”的正确方法吗?我不想选择所有数据,然后删除不需要的行。这对我来说似乎很奇怪,但每个人都这么说,至少我读过的教程都这么说。好吧,在我看来,你读过的哪个教程是错误的。您不应该将

我正在Visual Studio中学习MVC4,对此我有很多问题。我对MVC的第一句话是MVC的模型没有达到我的预期。我希望模型根据需要选择并返回数据行

但我读了很多教程,他们建议我让模型返回表中的所有数据,然后删除控制器中不需要的数据,然后将其发送到视图

以下是教程中的代码

模型


这是对select语句应用“where子句”的正确方法吗?我不想选择所有数据,然后删除不需要的行。这对我来说似乎很奇怪,但每个人都这么说,至少我读过的教程都这么说。

好吧,在我看来,你读过的哪个教程是错误的。您不应该将实际实体返回到视图,而应该返回视图模型。下面是我将如何重新编写您的示例:

public class ApartmentViewModel
{
    public int RoomCount { get; set; }
    ...
}

public ActionResult Index()
{
    using (var db = new ApartmentContext())
    {
        var apartments = from a in db.Apartments
                        where a.no_of_rooms == 5
                        select new ApartmentViewModel()
                        {
                            RoomCount = a.no_of_rooms
                            ...
                        };
        return View(apartments.ToList());
    }
}
这是对select语句应用“where子句”的正确方法吗

是的,这条路很好。但是,您需要了解在
IQueryable
上调用
Where
(以及各种其他LINQ命令)时实际发生的情况。我假设您使用的是EF,因此
Where
查询不会立即执行(因为EF使用延迟执行)。因此,基本上,您是在向视图传递一个尚未运行的查询,并且只有在视图尝试呈现数据时,查询才会运行—此时您的
ApartmentContext
将被释放,并因此引发异常

db.Apartments.Where(...).ToList();

这会导致查询立即执行,意味着您的查询不再依赖于上下文。然而,在MVC中,这仍然不是正确的做法,我提供的示例被认为是推荐的方法。

好吧,你从哪个教程中读到的都是错误的(在我看来)。您不应该将实际实体返回到视图,而应该返回视图模型。下面是我将如何重新编写您的示例:

public class ApartmentViewModel
{
    public int RoomCount { get; set; }
    ...
}

public ActionResult Index()
{
    using (var db = new ApartmentContext())
    {
        var apartments = from a in db.Apartments
                        where a.no_of_rooms == 5
                        select new ApartmentViewModel()
                        {
                            RoomCount = a.no_of_rooms
                            ...
                        };
        return View(apartments.ToList());
    }
}
这是对select语句应用“where子句”的正确方法吗

是的,这条路很好。但是,您需要了解在
IQueryable
上调用
Where
(以及各种其他LINQ命令)时实际发生的情况。我假设您使用的是EF,因此
Where
查询不会立即执行(因为EF使用延迟执行)。因此,基本上,您是在向视图传递一个尚未运行的查询,并且只有在视图尝试呈现数据时,查询才会运行—此时您的
ApartmentContext
将被释放,并因此引发异常

db.Apartments.Where(...).ToList();

这会导致查询立即执行,意味着您的查询不再依赖于上下文。然而,在MVC中,这仍然不是正确的做法,我提供的示例被认为是推荐的方法。

在我们的项目中,我们将添加一个数据访问层,而不是在controller中访问域。并返回视图模型而不是域

但是在你的代码中,你只选择了你需要的数据,而不是所有的数据

如果打开SQL Profiler,您将看到这是一个带有where条件的select语句


所以,如果它不是一个大项目,我认为它是可以的。

在我们的项目中,我们将添加一个数据访问层,而不是访问控制器中的域。并返回视图模型而不是域

但是在你的代码中,你只选择了你需要的数据,而不是所有的数据

如果打开SQL Profiler,您将看到这是一个带有where条件的select语句


因此,如果它不是一个大项目,我想它是可以的。

我看不到这些教程,但你确定它正在加载所有数据吗?看起来您使用的是实体框架,实体框架使用的是。和延迟加载状态:

启用延迟加载后,相关对象将在加载时加载 通过导航属性访问


因此,似乎您正在加载所有数据,但数据本身仅在访问对象本身时从SQL检索。

我看不到这些教程,但您确定它正在加载所有数据吗?看起来您使用的是实体框架,实体框架使用的是。和延迟加载状态:

启用延迟加载后,相关对象将在加载时加载 通过导航属性访问


因此,似乎只有在访问对象本身时才从SQL检索加载所有数据,但数据本身除外。

我尝试使用您的代码,但出现了一个异常-传递到字典中的模型项的类型为“System.data.Entity.Infrastructure.DbQuery
1[ConstructionProject.Models.ApartmentModel]”,但此词典需要类型为“System.Collections.Generic.IEnumerable”的模型项。@ayilmaz我忘记在公寓查询中添加
ToList()
调用-请参阅更新。我不同意“返回实际实体是错误的”。大多数官方教程都在教授这一点。这就是美的一部分——简单而快速的脚手架。当然,在某些用例中,您必须关心某些属性的安全性,但这并不意味着您必须将每个实体映射到viewmodel。我添加了ToList(),但仍然给出了此异常“传递到字典中的模型项的类型为'System.Collections.Generic.List
1[ConstructionProject.Models.ApartmentModel]',但此词典需要“System.Collections.Generic.IEnumerable”类型的模型项
1[ConstructionProject.Models.ApartmentModel]'@ayilmaz您需要更新视图以接受
ApartmentViewModel
作为其模型,而不是原始实体类型,即
@model-ConstructionProject.Models.ApartmentViewModel
。我试图使用您的代码,但出现了一个异常-传递到字典中的模型项的类型为“System.Data.entity.Infrastructure.D”