我有两个通过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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。