c# - EF DbSet.Find 抛出 InvalidOperationException

标签 c# entity-framework

我有两个通过 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/

相关文章:

c# - 在 C# : Why Does Out Parameter Need to be Named As Well? 中混用和命名参数

asp.net-mvc-3 - 实体和派生 View 模型 - 仅更新公共(public)属性

.net - Entity Framework 写锁定选择

c# - Entity Framework 模型缓存使其无法用于大量数据库模式

c# - 无法启动应用程序,KernelBase.dll 错误

c# - 在 C# 中向 Datalogic Barcodescanner 发送蜂鸣信号

c# - 韩国操作系统上的控件大小增加

c# - Entity Framework /Linq 表达式从字符串转换为 int

java - JPA:消息+通知数据库架构

c# - 是否可以构造一个泛型方法以便 T 是可选的?