gpt4 book ai didi

c# - EF DbSet.Find 抛出 InvalidOperationException

转载 作者:行者123 更新时间:2023-11-30 12:57:52 25 4
gpt4 key购买 nike

我有两个通过 TPT 继承模式连接的实体:

public class User {...}
public class Employee : User {...}

如您所见,基类不是抽象的,因此两种实体类型都可以添加到数据库集中。有两个独立的集合(我的模型中都需要它们):

public DbSet<User> Users { get; set; }
public DbSet<Employee> Employees { get; set; }

因此,基本上,Users 表包含所有实体,而 Employees 仅包含实例化为 new Employee() 的对象的附加数据。

现在,当我尝试使用 Find 方法从 Employees 集合中获取实体时,我预计它只会返回“实际”员工。但是,如果我指定用户实体的 Id,EF 仍会从数据库中获取它,然后抛出 InvalidOperationException:

"The specified cast from a materialized 'System.Data.Entity.DynamicProxies.User_B2E5EC989E36BE8C53B9285A70C4E879F0B5672E1D141B93FD299D1BA60258EE' type to the 'Data.Employee' type is not valid."

它不能将 User 转换为 Employee,这是可以理解的。

我的问题是 - 是否有一种方法可以配置 TPT 继承,以便在将不存在的 Id 传递给它时 Find 在这种情况下只返回 null。

我目前的解决方法是:

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);

关于c# - EF DbSet.Find 抛出 InvalidOperationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32497396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com