带有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中,如果名称不是完整的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)
时,使用大写的模式名称至关重要。