簡體   English   中英

帶有Oracle表/視圖的Entity Framework 5是否不存在不一致?

[英]Entity Framework 5 with Oracle table/view doesn't exist inconsistency?

關於此問題的任何幫助或建議,我們將不勝感激。

我目前正在從事一個項目,該項目需要將我們的數據層從本地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實體(和配置)。

我的實體是相對簡單的平面對象。

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();

...產生“表或視圖不存在”錯誤。

這僅僅是Code-First方法的問題,還是我在這里遺漏了一些東西? 在調試應用程序時,我可以看到傳遞給配置類的viewName與傳遞給SqlQuery中使用的sql語句的視圖名相同。 我試過刪除HasEntitySetName()並將IDbSet更改為標准HourlyPrices,但這也不起作用。

再次感謝,提前。

我想確認表名也有同樣的問題。 在Oracle中,如果名稱不全為大寫,則找不到表/視圖。

代碼優先自動遷移僅限於僅使用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)時,具有大寫字母的架構名稱至關重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM