[英]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.