Как обновить DataContext на основе изменений в структуре базы данных? - PullRequest
4 голосов
/ 28 февраля 2012

Я работаю в Visual Studio 2010, используя linq-to-sql's DataContext, который имеет несколько сопоставлений с таблицами в базе данных.Теперь, когда я что-то изменил в структуре базы данных, я заметил, что DataContext не меняется и приводит к ошибкам.DataContext больше не соответствует структуре базы данных.Я обычно решаю эту проблему, удаляя все таблицы таблиц в DataContext и перетаскивая их снова из Проводника баз данных в Visual Studio.Я просто чувствую, что это очень громоздко и что должен быть лучший способ сделать это?Есть ли кнопка или опция для автоматического обновления DataContext при изменении структуры базы данных?

Ответы [ 3 ]

3 голосов
/ 28 февраля 2012

Модели Linq2Sql отключаются от источника данных после их создания.Только в момент перетаскивания элементов из проводника источника данных устанавливается соединение и запрашивается схема базы данных.Если изменения вашей схемы небольшие (то есть новый столбец таблицы), то достаточно легко добавить их вручную.Для более радикальных изменений схемы ваш текущий метод, вероятно, самый быстрый и простой.

Это - это возможность автоматизировать этот процесс генерации кода с помощью командной строки sqlmetal.exe инструмент.В прошлом я работал над проектами со схемами баз данных, которые постоянно менялись, и мы вызывали sqlmetal перед каждой сборкой, поэтому мы получали полезные ошибки компиляции при их изменении.Если ваша схема не сильно меняется, вы можете просто добавить в проект пакетный файл, чтобы при необходимости обновить модель Linq2Sql.

0 голосов
/ 25 мая 2017

В EF Core может оказаться полезной определенная команда «scaffolding».

Строительные леса могут восстановить ваши DbContext, а также ваши модели.И по моему опыту, не будет переопределять любые пользовательские partial classes, которые вы сделали для расширения DbContext, поэтому они продолжают работать.

Возможно, вам придется установить определенные инструментыдобавление их в ваш project.json (старый) / csproj (новый)

dotnet cli

dotnet ef dbcontext scaffold --help`

Usage: dotnet ef dbcontext scaffold [arguments] [options]
Arguments:
  <CONNECTION>  The connection string to the database.
  <PROVIDER>    The provider to use. (E.g.  Microsoft.EntityFrameworkCore.SqlServer)

Эта команда (запускается из корневого каталога проекта, если вы храните ваши модели в папке).называется "Модели");1) обновляет мои Модели и 2) мой DbContext.Если вам нужны только обновления вашего DbContext, я использую source-control (git), чтобы отменить изменения в Моделях;сохранить изменения в DbContext.

dotnet ef dbcontext scaffold "{connection}" Microsoft.EntityFrameworkCore.SqlServer \
-f --output-dir=Models

Powershell

Подробнее здесь , сокращенная команда:

SYNTAX
    Scaffold-DbContext [-Connection] <String> [-Provider] <String> [-OutputDir <String>] [-Context <String>] [-Schemas <String[]>] [-Tables <String[]>] [-DataAnnotations] [-Force] [-Environment <String>] [-Project <String>] [-StartupProject <String>]
    [<CommonParameters>]

PARAMETERS
    -Connection <String>
        The connection string to the database.

    -Provider <String>
        The provider to use. (E.g. Microsoft.EntityFrameworkCore.SqlServer)

    -OutputDir <String>
        The directory to put files in. Paths are relaive to the project directory.

    -Context <String>
        The name of the DbContext to generate.

    ....

    -Force [<SwitchParameter>]
        Overwrite existing files.
0 голосов
/ 03 декабря 2014

пусть строка подключения будет: строка pp = @ "Источник данных = (LocalDB) \ v11.0; AttachDbFilename = C: \ Program Files \ Microsoft SQL Server \ MSSQL11.MSSQLSERVER \ MSSQL \ DATA \ AdventureWorks2012_Data.mdf; Интегрированная безопасность= True; Тайм-аут подключения = 30 ";

и задача обновления должна быть указана ниже:

  public async Task callupdate()
        {
            try
            {
                int ppp = Convert.ToInt32(textBox1ID.Text);
                DataClasses1DataContext dc = new DataClasses1DataContext(pp);

                Person person = dc.Persons.Single(c => c.BusinessEntityID == ppp);
                person.PersonType = Convert.ToString(PersonTypecomboBox1.SelectedItem);
                person.PersonType = Convert.ToString(PersonTypecomboBox1.SelectedItem);
                if (NameStylecomboBox1.SelectedText == "False")
                    person.NameStyle = false;
                else
                    person.NameStyle = true;
                person.Title = Convert.ToString(TitlecomboBox1.SelectedItem);
                person.FirstName = FirstNametextBox2.Text;
                person.MiddleName = MiddleNametextBox3.Text;
                person.LastName = LastNametextBox4.Text;
                person.Suffix = SuffixtextBox5.Text;
                person.EmailPromotion = Convert.ToInt32(EmailPromotiontextBox6.Text);
                person.ModifiedDate = DateTime.Today;
                dc.SubmitChanges();
            }
            catch(Exception exp)
                {

                }

        }

вместо DataClasses1DataContext dc = new DataClasses1DataContext();

DataClasses1DataContext dc = new DataClasses1DataContext(pp);

Vby вызывает SubmitChanges() данные обновления, которые являются объектом нашего класса, фактически записываются в фактическую базу данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...