#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;
}