繁体   English   中英

首先使用C#实体框架数据库-仅使用某些字段

[英]C# Entity Framework Database First - use only some fields

我先使用EF数据库和ASP.NET MVC创建一个站点(我遵循了本教程的全部内容: https : //www.asp.net/mvc/overview/getting-started/database-first-development/creating-the -web-application ),一切正常。

问题是在索引视图(记录列表)中,我想从实体中删除字段之一。 我不仅希望将其隐藏在视图中,还希望将其全部删除(问题是它包含很大的数据块,这使得列表的加载非常缓慢)。

我确实想在“编辑”视图上显示和使用所有字段。

如果我从实体中删除一个字段,则会出现此错误:

实体类型XXX不是当前上下文模型的一部分。

 return View(db.XXX.ToList());

我能做什么?

有两种方法可以解决此问题。 当前的问题是.ToList()。 如果您只是执行db.XXX,那么您将获得一个Enumerable,在枚举之前,Enumerable只是一组从DB抓取数据的指令。 一旦调用.ToList(),它将实际上从数据库中获取数据,这是花费了很长时间的步骤。

我认为最好的做法是定义一个ViewModel,其中包含除具有大量数据的字段以外的所有字段。

public class ViewModel
{ 
     public ViewModel(){}
     public int Id {get;set;}
     public string OtherData {get;set;}
}

将db.XXX移到View函数之外,如下所示:

var initialDBObject = db.XXX;

从那里可以使用Enumerable(它仍然只是从数据库访问数据的一组指令),然后将其选择到ViewModel对象中,如下所示:

var viewModelObject = initialDBObject.Select(x=> new ViewModel
    {
        Id = x.Id;
        OtherData = x.OtherData;
        //do not add the large column of data to the ViewModel
    });

这里发生的事情(在调用ToList()之前)是您正在修改linq在幕后生成的查询以从表XXX中获取数据(如果在此行上放置断点并将鼠标悬停在initialDBObject上,您将看到SQL生成)。 一旦调用ToList(),查询将获取数据并将其插入到ViewModel对象(而不是XXX对象,由您的.edmx文件定义)中,而不仅仅是从表XXX中获取数据。

你也可以

.Select(x=> new 
{
    Id, 
    OtherData
});

并创建一个匿名对象,但是要使一个匿名对象在View中工作有点复杂。

然后,您需要更新“索引视图”页面以使用ViewModel而不是原始数据库对象,并且可以像这样传递它:

View(viewModelObject.ToList()); 

但是,将ViewModel命名为ViewModel之外的其他名称。 类似于[数据库表名称] ViewModel或类似名称。

如果数据库中有很多行,则加载所有数据仍将花费很长时间,在这种情况下,您需要研究分页。

ToList()本身没有问题,最初的问题是由对ToList()的调用引起的,因为正是在该点上,程序才进入数据库并使用linq生成的查询来捕获数据。 如果您尝试ToList()整个表的数据价值,或者像您的情况一样,创建一列包含大量数据的列,则可能要花一些时间,或者可能会用完内存。

关于您必须在.Select()中包含的15列,是的,这很烦人。 不幸的是,您不能在linq语句中使用构造函数,因此被迫填充每一列。

定义ViewModel的另一种方法(可能会更简单一些)是打开.edmx设计图面,右键单击背景并添加New-> Entity。 您可以使用表XXX作为基础,给它一个不同的名称,例如XXXViewModel或其他名称,然后删除包含大量数据的列。 然后,您只需要执行db.XXXViewModel.ToList()。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM