[英]EF DbSet.Find throws InvalidOperationException
我有兩個通過TPT繼承模式連接的實體:
public class User {...}
public class Employee : User {...}
如您所見,基類不是抽象的,因此可以將兩種實體類型添加到db-sets中。 有兩個單獨的集合(我的模型中都需要它們):
public DbSet<User> Users { get; set; }
public DbSet<Employee> Employees { get; set; }
因此,基本上, Users
表包含所有實體, Employees
僅為實例化為new Employee()
對象保存附加數據。
現在,當我嘗試從使用Find
方法設置的Employees
獲取實體時,我希望它只會返回“實際”員工。 但是,如果我指定了User實體的Id,EF仍會從數據庫中獲取它,然后拋出InvalidOperationException
:
“從物化'System.Data.Entity.DynamicProxies.User_B2E5EC989E36BE8C53B9285A70C4E879F0B5672E1D141B93FD299D1BA60258EE'類型到'Data.Employee'類型的指定強制轉換無效。”
它無法將User轉換為Employee,這是可以理解的。
我的問題是 - 有沒有辦法配置TPT繼承,所以在這種情況下,Find只返回null,就像你將不存在的Id傳遞給它時一樣。
我目前的解決方法是:
public Employee GetEmployeeById(int id)
{
try
{
return Employees.Find(id);
}
catch(InvalidOperationException ex) when (ex.Message.StartsWith("The specified cast from a materialized"))
{
return null;
}
}
但我不喜歡它的外觀 - 所以也許有一個更好(更優雅)的解決方案?
我傾向於選擇singleordefault()/ firstordefault()而不是find,因為如果沒有找到匹配項,它將直接返回null,但是你可以使用像這樣的Find的謂詞嗎?
return Employees.Find(em => em.id == id && em is Employee);
您缺少DbContext實例。 您無法搜索表類型coz thats聲明。
var checkfind = dbInstance.Employees.Find(searchedID);
如果您無法直接訪問您使用的Db
using (DBLocal db = new DBLocal())
{
db.Employees.Find(searchedID);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.