c# – EF DbSet.Find抛出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仅为实例化为新Employee()的对象保存附加数据. 现在,当我尝试从使用Find方法设置的Employees中获取实体时,我希望它只会返回“实际”员工.但是,如果我指定了User实体的Id,EF仍会从数据库中获取它,然后抛出InvalidOperationException:
它无法将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); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如果没有金额聚合的中间步骤,我怎样才能得到相同的图?
- c# – 使用asp.net中的Zero Clipboard将文本复制到剪贴板
- ruby-on-rails – 根据上下文返回所有标签 – ActsAsTaggab
- oracle 缓存db_keep_cache_size
- c – 如何在qt中编写我自己的集合?
- react native学习笔记1——webstorm安装与配置
- c# – 实体框架 – 使用order by和group by的Linq查询
- 依赖、关联、聚合和组合及其之间区别的简单理解
- 从Flash执行的JavaScript代码执行什么线程?
- function – PostgreSQL – RETURNING INTO数组