2012-02-28 60 views
4

我正在使用linq-to-sql的DataContext在Visual Studio 2010中工作,它有几个映射到数据库中的表。现在,当我将某些内容更改为数据库结构时,我注意到DataContext不会更改并导致错误。 DataContext不再符合数据库的结构。我通常通过删除DataContext中的所有表映射来解决此问题,并从Visual Studio的数据库资源管理器中再次拖动它们。我只是觉得这很麻烦,而且必须有更好的方法来做到这一点?当我更改数据库结构时,是否有按钮或选项可以自动更新DataContext?如何根据数据库结构的变化更新DataContext?

+0

@Niklas以及这有点高兴听到另一个人也有类似的问题,但随后'实体Framework'。但接受的解决方案或多或少是我所做的。但是,当多个表格发生变化并且您不知道哪些表格时,这会有点麻烦。您将最终每次删除并添加它们。我认为一定有更好的办法? – Bazzz 2012-02-28 09:38:31

+0

[如何将Linq更新到SQL dbml文件?](http://stackoverflow.com/questions/1110171/how-to-update-linq-to-sql-dbml-file) – MattDavey 2012-02-28 09:58:21

+0

@MattDavey可能重复像复制品一样。我只是没有设法制定我的标题,以便在提出我的问题的同时,您的文章成为一个建议。随意投票结束。 – Bazzz 2012-02-28 10:37:23

回答

3

Linq2Sql模型在生成后会与数据源断开连接。只是在拖动&从数据源资源管理器中删除项目来建立连接并查询数据库模式。如果您的模式更改很小(即新的表格列),则可以很容易地手动添加这些内容。对于更剧烈的模式更改,您当前的方法可能是最快最简单的方法。

可能通过使用sqlmetal.exe命令行工具自动执行此代码生成过程。我在过去的项目中使用了不断变化的数据库模式,并且在每次构建之前调用sqlmetal,因此当它发生更改时,我们得到了有用的编译错误。如果您的模式没有发生太大的变化,您可以在项目中简单地创建一个批处理文件,以便在必要时更新Linq2Sql模型。

+0

我会给'sqlmetal'一个尝试,我读过你的文章,并相信这是我所追求的。 – Bazzz 2012-02-28 10:38:07

-1

让connectionstrin为: string pp = @“Data Source =(LocalDB)\ v11.0; AttachDbFilename = C:\ Program Files \ Microsoft SQL Server \ MSSQL11.MSSQLSERVER \ MSSQL \ DATA \ AdventureWorks2012_Data.mdf;集成安全性=真;连接超时= 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

你似乎完全不了解这个问题。 – 2014-12-15 07:55:27

0

EF Core中,您可能会发现某些“脚手架”命令很有帮助。

脚手架可以再生您的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) 

此命令(从项目的根目录下,假设您将模型保存在名为“Models”的文件夹中); 1)更新我的模型和2)我的DbContext。如果你只想更新你的DbContext,我使用源代码控制(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.