При переименовании таблиц или столбцов, как гарантировать, что edmx «Обновить модель из базы данных» распознает новую структуру таблицы?
MyTable имеет всего 2 столбца.
ID
name
Рефакторинг -> Переименовать (Ctrl R + R)
myTableID
fullName
Что из следующего будет "правильным" соответствующим изменением edmx, чтобы приложение работало без ошибок времени выполнения / компиляции
Как видите, это очень простое переименование.
Ошибка компиляции
Ошибка выполнения : Ошибка _current EFControl CS0103: имя '_current' не существует в текущем контексте
Неа. Я терпел неудачу как минимум 7 раз. Просто еще не знаю, в чем загвоздка.





ОБНОВЛЕНИЕ: ПЕРЕИМЕНОВАНИЕ КОЛОНК Я вижу, что ваш вопрос изменился, поскольку вы спрашиваете о переименовании столбцов, поэтому я обновляю свой ответ. Давайте последуем вашему новому примеру и создадим вашу таблицу через T-SQL:
CREATE TABLE [dbo].MyTable
(
[Id] INT NOT NULL PRIMARY KEY,
[name] NCHAR(10) NULL
)
Entity Framework (EF) создаст для вас файл MyTable.cs:
public partial class MyTable
{
public int Id { get; set; }
public string name { get; set; }
}
И это основной раздел вашего EDMX:
<edmx:ConceptualModels>
<Schema Namespace = "database1Model" Alias = "Self" annotation:UseStrongSpatialTypes = "false" xmlns:annotation = "http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns:customannotation = "http://schemas.microsoft.com/ado/2013/11/edm/customannotation" xmlns = "http://schemas.microsoft.com/ado/2009/11/edm">
<EntityContainer Name = "database1Entities" annotation:LazyLoadingEnabled = "true" >
<EntitySet Name = "MyTables" EntityType = "database1Model.MyTable" />
</EntityContainer>
<EntityType Name = "MyTable">
<Key>
<PropertyRef Name = "Id" />
</Key>
<Property Name = "Id" Type = "Int32" Nullable = "false" />
<Property Name = "name" Type = "String" MaxLength = "10" FixedLength = "true" Unicode = "true" />
</EntityType>
</Schema>
</edmx:ConceptualModels>
Затем вы переименовываете свои столбцы, используя, например, Visual Studio Server Explorer, который сгенерирует этот T-SQL (я не вставлял никаких данных в MyTable):
CREATE TABLE [dbo].[MyTable] (
[myTableID] INT NOT NULL,
[fullName] NCHAR (10) NULL,
PRIMARY KEY CLUSTERED ([myTableID] ASC)
);
На этом этапе, если вы обновите свой EDMX из базы данных, вы получите следующее:
Итак, если вы откроете файл EDMX и удалите три элемента, за которыми следует <!-- REMOVE --->, как показано ниже:
<edmx:ConceptualModels>
<Schema Namespace = "database1Model" Alias = "Self" annotation:UseStrongSpatialTypes = "false" xmlns:annotation = "http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns:customannotation = "http://schemas.microsoft.com/ado/2013/11/edm/customannotation" xmlns = "http://schemas.microsoft.com/ado/2009/11/edm">
<EntityContainer Name = "database1Entities" annotation:LazyLoadingEnabled = "true" >
<EntitySet Name = "MyTables" EntityType = "database1Model.MyTable" />
</EntityContainer>
<EntityType Name = "MyTable">
<Key>
<PropertyRef Name = "Id" /><!-- REMOVE -->
<PropertyRef Name = "myTableID" />
</Key>
<Property Name = "Id" Type = "Int32" Nullable = "false" /><!-- REMOVE -->
<Property Name = "name" Type = "String" MaxLength = "10" FixedLength = "true" Unicode = "true" /><!-- REMOVE -->
<Property Name = "myTableID" Type = "Int32" Nullable = "false" />
<Property Name = "fullName" Type = "String" MaxLength = "10" FixedLength = "true" Unicode = "true" />
</EntityType>
</Schema>
</edmx:ConceptualModels>
и обновите свою модель, все готово. Даже ваш автоматически сгенерированный файл MyTable.cs будет обновлен с новыми именами:
public partial class MyTable
{
public int myTableID { get; set; }
public string fullName { get; set; }
}
ОТВЕТ НА ОРИГИНАЛЬНЫЙ ВОПРОС: ПЕРЕИМЕНОВАНИЕ ТАБЛИЦЫ Один из способов сделать это - отредактировать файл .EDMX, который Entity Framework создал для вас и в котором хранится вся информация, касающаяся сопоставления базы данных с вашими объектами. Этот файл можно найти в корневой папке вашего проекта, то есть там, где находится файл .csproj, и представляет собой просто XML, который вы можете открыть с помощью текстового редактора.
Я предполагаю, что ваш класс Foo соответствовал таблице Foo; последний теперь, вероятно, будет FooNew или что-то подобное.
Чтобы переименовать таблицу, но сохранить класс Foo, просто найдите эту часть вашего файла EDMX:
<!-- SSDL content -->
<edmx:StorageModels>
...
<EntitySet Name = "Foo" ... Schema = "dbo" ... />
...
</edmx:StorageModels>
Внутри EntitySet добавьте Table = "FooNew" как атрибут, как указано в ответе на этот вопрос:
<EntitySet Name = "Foo" ... Schema = "dbo" ... Table = "FooNew" />
На этом этапе закройте и сохраните; повторно откройте edmx, дважды щелкнув по нему, а затем «Обновить модель из базы данных», как вы это делали раньше.
Привет, Франческо, это все еще дает мне ошибку в сопоставлениях Entity framework.
Что происходит? Не могли бы вы предоставить более подробную информацию?
Ошибка времени выполнения для сопоставления Root Entity Framework: ошибка EFControl _current CS0103: имя '_current' не существует в текущем контексте
@DLNarasimhan Я обновил свой ответ (и, как видите, протестировал его).
Вы это решили?