【问题标题】:Using DbSet.Find with Oracle and EF CodeFirst将 DbSet.Find 与 Oracle 和 EF CodeFirst 一起使用
【发布时间】:2013-09-11 02:45:01
【问题描述】:

我在很多网站,特别是在 oracle 论坛中读到,Oracle 不正式支持 Entity Framework Code First 或 DbContext API。

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

一个似乎不起作用的函数是 DbSet.Find,您可以在其中将密钥作为参数传递并准确获取该记录。

使用 Find(如果我在同一个代码库上使用 sql server 就可以正常工作)会引发异常并出现以下错误:

ORA-00942: table or view does not exist

我阅读了this question 的相关信息,他们提到了套管,这不是我的情况,所以我无法解决。

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

有没有人在使用DbContext的时候成功使用过Find?

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

谢谢。

【问题讨论】:

    标签: c# oracle entity-framework odp.net odac


    【解决方案1】:

    事实证明,在我的类中所做的数据注释确实存在问题,我在其中一个上有错字,但异常没有公开引用的表或视图,所以找出的唯一方法是检查:

    [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 上,而不是在我的映射上。

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

    【讨论】:

      猜你喜欢
      • 2012-04-13
      • 2014-07-06
      • 2012-04-01
      • 2012-03-28
      • 1970-01-01
      • 2023-02-14
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      相关资源
      最近更新 更多