1

非常感谢有关此问题的任何帮助或建议。

我目前正在开展一个项目,该项目需要将我们的数据层从本地 MS SQL 实例更改为托管的 Oracle 解决方案。

以前,我们使用实体框架(代码优先)来构建我们的数据层。我想对新的数据层采用相同的方法。我们有几个使用这个库的应用程序,因此尽量保持新数据层与原始数据层(对象、名称等)接近是理想的。我知道甲骨文没有正式支持 Code-First(正在进行中的工作),但已经阅读了其他人取得了一些成功的地方。因此,出于这些原因,我正在尝试做同样的事情。

我创建了我的 Oracle EF 数据层,以尽可能与原始 MS SQL EF 数据层匹配。我目前遇到的问题是,当我运行查询以从数据层检索第一个或默认实体时,出现以下异常:

Oracle.DataAccess.Client.OracleException: ORA-00942: 表或视图不存在

如果我使用完全相同的 DbContext 实例,而是使用 DbContext.Database.SqlQuery(sqlString) 运行 sql 查询,它就可以工作。我提到这个的原因是因为我读过“表或视图不存在”错误是指数据库权限问题。这次似乎不是这种情况,因为我在同一个连接对象中使用了完全相同的连接字符串。唯一的区别似乎在于使用传统的 sql 语句与 DbSet 实体(和配置)。

我的实体是相对简单的平面对象。

public class HourlyPrice
{
    public DateTime MarketDate { get; set; }
    public int HourEnding { get; set; }
    public string LocationId { get; set; }
    public string LocationName { get; set; }
    public decimal? Price { get; set; }
    public int IsValid { get; set; }
    public DateTime DateInserted { get; set; }
    public DateTime? DateUpdated { get; set; }
}

public HourlyPriceConfiguration(string viewName)
{
    ToTable(viewName);
    HasKey(x => new { x.MarketDate, x.HourEnding, x.LocationName });
    Property(x => x.Price).HasPrecision(13, 6);
    HasEntitySetName("SourceHourlyPrices");
}

在我的 DbContext 中,我添加了注入 viewName 的 HourlyPriceConfiguration ...

modelBuilder.Configurations.Add(new HourlyPriceConfiguration(this.viewName));

...并将我的 IDbSet 声明为 ...

public IDbSet<HourlyPrice> SourceHourlyPrices { get; set; }

运行代码时,这有效...

var sql = "select * from " + this.viewName;
var prices = db.Database.SqlQuery<HourlyPrice>(sql);
var price = prices.FirstOrDefault();

... 但是这个 ...

var price = db.SourceHourlyPrices.FirstOrDefault();

...产生“表或视图不存在”错误。

这只是代码优先方法的问题,还是我在这里遗漏了什么?调试应用程序时,我可以看到传递给配置类的 viewName 与传递给 SqlQuery 中使用的 sql 语句相同。我尝试删除 HasEntitySetName() 并将 IDbSet 更改为标准的 HourlyPrices,但这也不起作用。

再次感谢,提前。

4

4 回答 4

7

我想确认我对表名有同样的问题。在 Oracle 中,如果名称不全大写,则找不到表/视图。

于 2014-05-11T14:12:51.240 回答
3

Code First 自动迁移仅限于使用 dbo 模式。 https://community.oracle.com/thread/3622163

您可以将它放在 Context 类的开始 OnModelCreating 方法中作为解决方法

if (this.Database.Connection.GetType().Equals(typeof(Oracle.ManagedDataAccess.Client.OracleConnection)))
{
    modelBuilder.HasDefaultSchema(new Oracle.ManagedDataAccess.Client.OracleConnectionStringBuilder(this.Database.Connection.ConnectionString).UserID);
}
于 2015-03-03T12:44:14.820 回答
2

ORA-00942 异常不是权限问题(当然取决于您如何看待它);但这意味着您正在查询的表对您的用户不可见。

您可以尝试通过使用ToTable(tableName, schemaName)实现在 ToTable 方法调用中显式设置架构的名称,然后看看会发生什么。

于 2013-08-31T15:55:09.037 回答
0

只是想补充一点,在将数据库移动到不同的模式后我遇到了同样的问题。我意识到在使用ToTable(tableName, schemaName).

于 2015-01-23T07:52:43.357 回答