加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – EF DbSet.Find抛出InvalidOperationException

发布时间:2020-12-15 20:55:27 所属栏目:百科 来源:网络整理
导读:我有两个通过TPT继承模式连接的实体: public class User {...}public class Employee : User {...} 如您所见,基类不是抽象的,因此可以将两种实体类型添加到db-sets中.有两个单独的集合(我的模型中都需要它们): public DbSetUser Users { get; set; }public
我有两个通过TPT继承模式连接的实体:

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

如您所见,基类不是抽象的,因此可以将两种实体类型添加到db-sets中.有两个单独的集合(我的模型中都需要它们):

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

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

现在,当我尝试从使用Find方法设置的Employees中获取实体时,我希望它只会返回“实际”员工.但是,如果我指定了User实体的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继承,所以在这种情况下,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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读