簡體   English   中英

如何使用EF Core中的select方法獲取所有以前的數據

[英]How to get all previous data by using select method in EF Core

我知道我的問題有點困惑,但是讓我詳細解釋。
假設我有這樣的人類。

public class Person {
  public int Id {get; set;}  
  public string Name {get; set;}  
}  

我想創建一個新實體,但是這兩個類是類似的,所以我只想繼承並添加一些新屬性

public class Employee : Person {
  public string Position {get; set;}
}

一切正常,但是當我想從人員表中選擇數據並將其添加到Employee類時遇到問題

employee = _context.Person.Select(
              a => new Employee {
              Name = a.Name,
              Position = "Programmer"
            }).ToList();  

因此,如您在此處看到的,我要添加position屬性,但也要從人員表中獲取先前的數據。 問題是,我必須手動輸入人員表中的先前數據。 如果人員表具有很多屬性,則需要鍵入所有屬性以獲取所有數據。 無論如何,有沒有獲得所有以前的數據而無需輸入所有數據。 所以在javascript中有類似

new State = {
...State,
Position : "employee"
} 

是否可以在C#中執行類似的操作?

將員工作為實體,您可以使用

var employees = _context.Employee.Include(e=>e.Person).ToList(); 

那么您將像這樣的employees[0].Person.Name等進行操作。

如果您了解我的意思,那么您實質上是想將現有的Person實體“升級”到Employee實體。 不幸的是,這並不像您想要的那樣簡單或直接。 EF Core通過帶有歧視項列的單個表對繼承進行建模。 當從數據庫中拉出實體時,該鑒別符列通知應實際實例化哪種類類型。 由於已將其保存為Person ,因此它將以“ Person”作為值,並且當您從數據庫中檢索它時,EF Core將實例化Person實例。

然后,您可以將其轉換為Employee ,但EF Core將不知道如何處理。 從技術上講,向下轉換的實例將不會被跟蹤。 如果嘗試跟蹤它,則保存時會出錯,因為EF Core會嘗試添加與現有Person PK相同的新Employee 繁榮。

最好的選擇是將Person實例中的數據映射到新的 Employee實例,包括所有關聯的關系。 然后,創建Employee ,使關系在數據庫級別移動,最后移除舊的Person

當然,這將導致分配新的PK(這就是為什么遷移相關實體很重要的原因),並且如果您有引用該PK的URL或只是在處理自動增加PK。 如果這樣做,您最終會在鍵中留下空白,甚至有可能用完鍵。

唯一可能的替代方法是更改​​“鑒別符”列的值。 這必須通過直接的SQL來完成,因為discriminator列是EF Core不公開的shadow屬性(即無法通過C#代碼對其進行修改)。 但是,如果從字面上將值更改為類似於“ Employee”的值,則在獲取它時,EF將創建一個Employee實例,所有Employee特定的屬性都將為null或默認值。 但是,此時,您可以進行必要的更新並將其保存回去。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM