Новая таблица .NET SQL не существует - PullRequest
1 голос
/ 29 сентября 2011

ПРИМЕЧАНИЕ: Эта проблема была решена, но привела к новому вопросу .


Я получаю эту ошибку:

System.Data.SqlClient.SqlException "Неверное имя объекта [имя таблицы]"

Я работаю над обновлением БД, которое будет поставляться с обновлением развернутого продукта. При первом запуске обновленного приложения выполняется обновление базы данных, и оно имеет два основных этапа.

  1. Запустить скрипт update.sql для добавления новых таблиц в базу данных
  2. Вызвать некоторые методы, чтобы скопировать некоторые данные из существующих таблиц для всплытия новых таблиц, и выполнить некоторые математические операции / внести некоторые коррективы.

Шаг первый работает без нареканий. Шаг второй генерирует исключение выше всякий раз, когда он ссылается на любую из новых таблиц. Код, вызываемый там, где появляется исключение, используется несколько раз в (новой версии) приложения и, как правило, работает нормально. Можно было бы ожидать, что эта проблема возникнет, если этот код будет работать со старой версией базы данных (поскольку используемые им таблицы не существуют), но в этом случае таблицы были только что добавлены.

Обновление кода:

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 (); * 1 052 *

ОБНОВЛЕНИЕ :
Используя этот вопрос и ответ , я смог успешно выполнить сценарий SQL, используя соединение AppEntities, и таблицы действительно появились в базе данных. Однако AppEntities (объект класса, инициализированный после запускаемого сценарием) по-прежнему выдает исключение недопустимого имени объекта.

Есть ли способ заставить контекст данных обновляться из базы данных во время выполнения?

ОБНОВЛЕНИЕ (с решением):
Копаться в AppEntities (согласно предложению Криса Лайвли) было огромной головной болью, но это также привело меня к копанию в некоторых файлах конфигурации. Именно там я обнаружил, что новые таблицы сопоставляются с именем в единственном числе, а не во множественном числе (TableForEntity, а не TableForEntities), где раньше они были во множественном числе (когда это работало). Старые таблицы тоже были во множественном числе. Изменение здесь новых таблиц на множественное число вызвало всевозможные ошибки, поэтому я просто изменил сценарий SQL, назвав их в единственном числе. Удивительно, но это сработало.

Учитывая, что SQL-скрипт, который назвал их во множественном числе, был автоматически сгенерирован на основе базы данных, которая действительно работала (где они были названы множественно), зачем менять работу именования? Во всяком случае, это должно вызвать проблему, которую она исправила.

1 Ответ

1 голос
/ 29 сентября 2011

Я не уверен, что такое AppEntities, но я уверен, что он не отражает структуру вашей новой базы данных.

Я собираюсь предположить, что это некая форма сгенерированного кода, которая основана исключительно на начальной версии базы данных и не была recodegen'd (sp?) Для хранения информации о новых таблицах. Отсюда и ошибка.

Это также объясняет, почему приложение по-прежнему не работает в том же месте, когда вы создали таблицы еще до его запуска.

Подводя итог, исследуйте AppEntities и выясните, как именно это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...