![](/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.