Информирование Entity Framework о таблицах / переименованиях столбцов - PullRequest
0 голосов
/ 25 апреля 2018

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

MyTable имеет только 2 столбца.

ID
name

Refactor -> Rename (Ctrl R + R)

myTableID
fullName

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

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

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

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

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

1 Ответ

0 голосов
/ 25 апреля 2018

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

enter image description here

Итак, если выоткройте файл 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, дважды щелкнув по нему, а затем «Обновить модель из базы данных», как вы делали раньше.

...