簡體   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