簡體   English   中英

EF DbSet.Find拋出InvalidOperationException

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

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