带有Oracle表/视图的Entity Framework 5;不存在不一致性

本文关键字:Framework 不存在 不一致性 Entity Oracle 视图 带有 | 更新日期: 2023-09-27 18:29:41

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

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

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

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

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

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

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

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中,我添加了HourlyPriceConfiguration注入viewName。。。

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语句的viewName相同。我尝试删除HasEntitySetName()并将IDbSet更改为标准HourlyPrices,但也没有成功。

再次提前感谢。

带有Oracle表/视图的Entity Framework 5;不存在不一致性

我想确认我的表名也有同样的问题。在Oracle中,如果名称不是完整的UPPER CASE,则找不到表/视图。

代码优先自动迁移仅限于使用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);
}

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

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

我只是想补充一点,在将数据库移动到不同的模式后,我也遇到了同样的问题。我意识到,在使用ToTable(tableName, schemaName)时,使用大写的模式名称至关重要。