Обеспечение поддержки Entity Framework переименований таблиц / столбцов

При переименовании таблиц или столбцов, как гарантировать, что edmx «Обновить модель из базы данных» распознает новую структуру таблицы?

MyTable имеет всего 2 столбца.

ID
name

Рефакторинг -> Переименовать (Ctrl R + R)

myTableID
fullName

Что из следующего будет "правильным" соответствующим изменением edmx, чтобы приложение работало без ошибок времени выполнения / компиляции

  1. Рефакторинг -> Переименовать в файле Edmx или
  2. Щелкните правой кнопкой мыши -> Обновить модель из базы данных, удалите старый элемент или
  3. Вручную создать, удалить и проверить edmx

Как видите, это очень простое переименование.

Ошибка компиляции

Ошибка выполнения : Ошибка _current EFControl CS0103: имя '_current' не существует в текущем контексте

Вы это решили?

Francesco B. 27.04.2018 07:16

Неа. Я терпел неудачу как минимум 7 раз. Просто еще не знаю, в чем загвоздка.

DL Narasimhan 27.04.2018 08:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
105
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

ОБНОВЛЕНИЕ: ПЕРЕИМЕНОВАНИЕ КОЛОНК Я вижу, что ваш вопрос изменился, поскольку вы спрашиваете о переименовании столбцов, поэтому я обновляю свой ответ. Давайте последуем вашему новому примеру и создадим вашу таблицу через 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, который вы можете открыть с помощью текстового редактора.

  1. Вне VisualStudio, например PsPad, NotePad ++ и т. д.
  2. Или щелкните его правой кнопкой мыши в Visual Studio, выбрав «Открыть с помощью ...» и выбрав «Редактор 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.

DL Narasimhan 04.05.2018 08:42

Что происходит? Не могли бы вы предоставить более подробную информацию?

Francesco B. 04.05.2018 14:36

Ошибка времени выполнения для сопоставления Root Entity Framework: ошибка EFControl _current CS0103: имя '_current' не существует в текущем контексте

DL Narasimhan 04.05.2018 14:56

@DLNarasimhan Я обновил свой ответ (и, как видите, протестировал его).

Francesco B. 06.05.2018 09:33

Другие вопросы по теме