![](/img/trans.png)
[英]Is it possible to generate database fields without using C# properties in Entity Framework, code-first approach?
[英]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.