微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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:

“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] 举报,一经查实,本站将立刻删除。

相关推荐