实体框架5与Oracle表/视图不存在不一致?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实体框架5与Oracle表/视图不存在不一致?相关的知识,希望对你有一定的参考价值。
非常感谢有关此问题的任何帮助或建议。
我目前正在开发一个项目,需要将我们的数据层从本地MS SQL实例更改为托管Oracle解决方案。
以前,我们使用Entity Framework(Code-First)来构建我们的数据层。我想对新数据层采取相同的方法。我们有几个使用此库的应用程序,因此尝试将新数据层保持为与原始数据层相同(对象,名称等)是理想的。我知道Code-First并没有得到Oracle的正式支持(一项正在进行中的工作),但已经读过其他人取得了一些成功的地方。因此,出于这些原因,我试图这样做。
我已经创建了我的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();
...生成“表或视图不存在”错误。
这只是Code-First方法的一个问题,还是我在这里遗漏了一些东西?调试应用程序时,我可以看到传递给配置类的viewName与传递给SqlQuery中使用的sql语句的视图相同。我已经尝试删除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)
时,使用大写的模式名称是至关重要的。
以上是关于实体框架5与Oracle表/视图不存在不一致?的主要内容,如果未能解决你的问题,请参考以下文章