«Нет такого столбца Extent2.» Проблемы

#c# #.net #data-modeling #edmx

#c# #.net #моделирование данных #edmx

Вопрос:

Я унаследовал большой проект c # и сталкиваюсь с проблемами при обновлении модели данных. Я внес свои обновления в редактор моделирования данных wysiwyg edmx (vs2010), и обновления кажутся нормальными. Но трудно сказать, поскольку, когда я запускаю программу, сразу же, когда она пытается получить доступ к базе данных, я получаю эту ошибку:

«Ошибка SQLite нет такого столбца: Extent2.Country_ID»

Country_ID — это свойство существующего объекта (которое я не изменял), но я понятия не имею, что такое «Extent2». Я провел тщательный текстовый поиск по всем связанным файлам проекта, и он не появился ни разу.

В исключении целевой сайт читает: {System.Data.Обычный.DbDataReader выполняет команды хранилища (System.Data.EntityClient.EntityCommand, System.Data.Командное поведение)}

К сожалению, дополнительной информации не так много; нет номеров ошибок или чего-либо еще. Есть идеи?

Спасибо

Ответ №1:

Extent2 является псевдонимом таблицы в SQL, сгенерированном Entity Framework. Похоже, что в вашей entity model где-то есть неправильная связь или отображение полей, из-за чего сгенерированные SQL-команды не соответствуют вашей фактической структуре базы данных.

Комментарии:

1. Возможно, вы правы, но, к сожалению, редактор wysiwyg edmx был настолько ужасен, что в итоге я просто перестал беспокоиться о взаимосвязи внутри фреймворка и добавил только объект и вручную обработал взаимосвязь

Ответ №2:

Если ваше приложение (которое использует Entity Framework на SQLite) открывает старую версию базы данных, в которой есть таблица, но нет столбца, вы можете обнаружить отсутствующий столбец и добавить его программно следующим образом:-

     private EntityFrameworkEntities _modelInstance;

    protected override void Load()
    {
        bool retry = false;
        if (!TryLoad(out retry))
        {
            if (retry)
            {
                AddColumnToTableInDatabase();
                TryLoad(out retry);
            }
        }
    }

    private bool TryLoad(out bool retry)
    {
        bool success = false;
        retry = false;
        using (_modelInstance = new EntityFrameworkEntities())
        {
            _modelInstance.Connection.Open();

            var yourQuery = from entity in _modelInstance.Entitys
                               select entity;
            try
            {
                foreach (Entity entity in yourQuery)
                {
                    var vm = new EntityViewModel(entity, this);
                    base.Children.Add(vm);
                }
                success = true;
            }
            catch (Exception ex)
            {
                while (ex.InnerException != null)
                    ex = ex.InnerException;
                if (ex.Message.ToLower().Contains("no such column") amp;amp; ex.Message.Split(new char[] { '.' })[1].Equals("Country_ID"))
                    retry = true;
                log.Error(ex.Message, ex);
            }
        }
        return success;
    }

    private bool AddColumnToTableInDatabase()
    {
        bool success = false;
        StringBuilder sql = new StringBuilder(@"ALTER TABLE [Entity] ADD COLUMN [Country_ID] [text] NULL");
        using (_modelInstance = new EntityFrameworkEntities())
        {
            _modelInstance.Connection.Open();
            var connection = (_modelInstance.Connection as EntityConnection).StoreConnection as SQLiteConnection;
            using (var transaction = connection.BeginTransaction())
            {
                try
                {
                    using (var command = connection.CreateCommand())
                    {
                        command.CommandText = sql.ToString();
                        command.ExecuteNonQuery();
                    }
                    transaction.Commit();
                    success = true;
                }
                catch (Exception ex)
                {
                    log.Error(ex.Message, ex);
                    transaction.Rollback();
                }
            }
        }
        return success;
    }