将 DbSet.Find 与 Oracle 和 EF CodeFirst 结合使用

本文关键字:CodeFirst 结合 EF DbSet Find Oracle | 更新日期: 2023-09-27 18:31:01

我在很多网站上读到过,特别是在oracle论坛上,Oracle不正式支持实体框架代码优先或DbContext API。

话虽如此,我也在很多地方读到人们已经成功地部署了使用 EF CodeFirst 和 Oracle 的项目。我一直在遇到很多问题,并一直在调整代码以使其也适用于SQL Server。

一个似乎不起作用的函数是 DbSet.Find 您将键作为参数传递并准确获取该记录的位置。

使用 Find(如果我在同一代码库上使用 sql 服务器,则工作正常)会引发异常并显示以下错误:

ORA-00942: table or view does not exist

读了这个问题,他们提到了外壳,这不是我的情况,所以对我来说没有修复。

奇怪的是,使用DbSet.SingleOrDefault(x => x.Id == SomeId)工作得很好,所以我很确定模式、表名和列的大小写很好。

有没有人在使用 DbContext 时成功使用查找?

请注意:我没有使用 EDMX,也无法使用它,我们必须继续使用 CodeFirst。

谢谢。

将 DbSet.Find 与 Oracle 和 EF CodeFirst 结合使用

事实证明,在我的类中进行的数据注释确实存在问题,并且我对其中一个有拼写错误,但异常不会公开引用的表或视图,因此找出答案的唯一方法是检查:

[TableName="MY_TABLE"]
public class MyClass
{
}

对应于表名

CREATE TABLE MY_TABLE {
}

。对于在我的 DbContext 实现上具有 DbSet 的所有类。

现在,DbSet.Find()抛出异常DbSet.SingleOrDefault()的原因并不超出我的知识范围,但我假设第一个遍历您的所有 POCO 类并尝试在 DbContext 对象中映射它们,即使您正在处理的 DbSet 与同一 DbContext 上的其他数据库集无关, 另一方面,SingleOrDefault()似乎只检查查询时实际要使用的那些表和对象的映射。

所以是的,我认为由于DbSet.SingleOrDefault()没有抛出和异常,但DbSet.Find()是,问题出在 EF 上,而不是我的映射上。

不同的扩展方法有不同的行为,所以要小心并注意这些映射!