[英].NET SQL new table doesn't exist
注意:此問題已解決,但是導致了一個新問題 。
我收到此錯誤:
System.Data.SqlClient.SqlException“無效的對象名稱[表名]”
我正在開發數據庫更新,以附帶對已部署產品的更新。 新更新的應用程序第一次運行時,數據庫更新運行,並且它具有兩個主要階段。
- 運行腳本update.sql將新表添加到數據庫
- 調用一些方法從現有表中復制一些數據以彈出新表,並進行一些數學運算/進行一些調整。
第一步工作無懈可擊。 每當第二步引用任何新表時,第二步就會引發異常。 在整個(新版本)應用程序中,多次使用稱為“彈出異常的地方”的代碼,通常情況下很好。 可以預期,如果此代碼與數據庫的舊版本一起運行(因為它使用的表不存在),則會發生此問題,但是在這種情況下,表已被添加。
更新代碼:
internal void Update()
{
RunScript(); //runs the SQL script, adds tables to the db
OtherClass oc = new OtherClass();
oc.PrepData(); //no error, just makes some minor tweaks to existing table
oc.CopyData(); //throws exception, none of the new tables appear to exist
oc.AdjustData(); //manipulates the data in the new table, probably throws exception but currently unreachable
}
public class OtherClass
{
private AppEntities db;
public OtherClass()
{
db = new AppEntities();
//other constructor activity
}
internal void CopyData()
{
foreach(DataItem di in db.DataItems) //This throws the exception (with any of the new tables)
{
}
}
}
如上所示,該異常是由將表添加到數據庫后初始化的實體集引發的,但是它仍然不承認其中的任何一個存在。
有沒有人遇到過這樣的事情? 有辦法解決嗎?
更新 :
我發現了一些我認為可能是問題的東西。 聲明AppEntities db
在OtherClass
已改為private AppEntities db = new AppEntities();
,並且不再在構造函數中對其進行初始化,導致在運行腳本之前創建了它。 不幸的是,解決此問題仍然會產生相同的問題。
更新 :
為了確保數據上下文了解新表,我更改了運行腳本的方式。
以前(針對數據庫正確執行的腳本,應用程序找不到新表):
StreamReader sr = new StreamReader(File.Open(String.Format("{0}/Scripts/CURRENTVERSION.sql", AppDomain.CurrentDomain.BaseDirectory), FileMode.Open));
string UpdateScript = sr.ReadToEnd();
sr.Close();
//Here connectionstring was the database's connection taken from the .edmx file and trimmed of arguments that caused exceptions as invalid
SqlConnection connection = new SqlConnection(connectionstring);
SqlCommand command = new SqlCommand(UpdateScript);
connection.Open();
command.ExecuteNonQuery();
connection.Close();
目前:
StreamReader sr = new StreamReader(File.Open(String.Format("{0}/Scripts/CURRENTVERSION.sql", AppDomain.CurrentDomain.BaseDirectory), FileMode.Open));
string UpdateScript = sr.ReadToEnd();
sr.Close();
System.Data.Common.DbCommand command = db.Connection.CreateCommand();
command.CommandText = UpdatScript;
//command.CommandText = @UpdateScript;
db.Connection.Open();
command.ExecuteNonQuery();
我已經嘗試了注釋行和未注釋行(帶/不帶@),但是它在腳本中的每一行都聲明了語法錯誤(與第一個方法完美執行的腳本相同)。 db.Connection.Close();
更新 :
使用此問題和答案 ,我能夠使用AppEntities連接成功執行SQL腳本,並且表格確實出現在數據庫中。 但是,AppEntities(在腳本運行后初始化的類的對象)仍然拋出無效的對象名稱的異常。
有沒有一種方法可以強制數據上下文在運行時從數據庫進行自身更新?
更新 (帶有解決方案):
深入研究AppEntities(根據克里斯·利弗利(Chris Lively)的建議)是一件令人頭疼的事,但這確實使我也深入了一些配置文件。 在那兒,我發現新表被映射為單數名稱,而不是復數形式( TableForEntity
而不是TableForEntities
),以前它們是復數形式(工作時)。 舊桌子也都是復數的。 在這里將新表更改為復數形式會導致各種錯誤,因此我最終只是更改了SQL腳本以將其命名為單數。 出人意料的是,這有效。
考慮到以復數形式命名它們的SQL腳本是根據實際工作的數據庫(在其中以復數形式命名)自動生成的,為什么要更改命名工作? 如果有的話,那應該會導致問題解決。
我不確定AppEntities是什么,但我非常有信心它不會反映您新數據庫的結構。
我將猜測這是某種形式的生成代碼,其完全基於數據庫的初始版本,並且尚未經過重新編碼(sp?)來保存有關新表的信息。 因此,錯誤。
這也可以解釋為什么在運行表之前創建表時,應用程序仍然在同一位置失敗。
綜上所述,研究AppEntities並弄清楚該事物是如何工作的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.