2012-02-28 3 views
4

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

+0

@Niklas хорошо это своего рода приятно слышать, что другой человек имеет подобную проблему, но затем с 'Entity Framework'. Но принятое решение более или менее то, что я делаю. Но это немного громоздко, когда несколько таблиц изменились, и вы не знаете, какие из них. Вы в конечном итоге удаляете и добавляете все из них каждый раз. Я полагаю, должен быть лучший способ? – Bazzz

+0

Возможный дубликат [Как обновить файл Linq to SQL dbml?] (Http://stackoverflow.com/questions/1110171/how-to-update-linq-to-sql-dbml-file) – MattDavey

+0

@MattDavey действительно выглядит как дубликат. Мне просто не удалось сформулировать мой заголовок, чтобы ваша статья появилась в качестве предложения при формулировании моего вопроса. Не стесняйтесь голосовать за закрытие. – Bazzz

ответ

3

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

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

+0

Я дам 'sqlmetal' попытку, я прочитал вам статью и верю, что это то, что мне нужно. – Bazzz

-1

пусть connectionstrin быть: строка с = @ "Источник данных = (LocalDB) \ v11.0; AttachDbFilename = C: \ Program Files \ Microsoft SQL Server \ MSSQL11.MSSQLSERVER \ MSSQL \ DATA \ AdventureWorks2012_Data.mdf; Integrated Security = 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() данные обновление, которое является объектом нашего класса на самом деле записывается в фактическая база данных

+0

Вы, кажется, совсем не поняли вопрос. –

0

В EF Core вы можете найти полезная команда "scaffolding".

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

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

DotNet кли

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

More info here, сокращенная команда:

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. 
Смежные вопросы