.NET实体框架:添加迁移太慢了

问题描述 投票:3回答:2

我正在努力将实体框架添加到我们当前基于Web的项目中。我们的项目目前有572个表。我正在考虑切换我们的数据库处理以使用迁移而不是我们现在如何做(这是一个膨胀的SQL文件,当我们合并时最终变得麻烦)。我创建了一个测试项目来试用实体框架。能够扭转工程师的模型(这需要一些时间,但值得花时间肯定)。下一步,我运行了启用迁移,创建了第一个迁移(在up方法中有每个表),这不是什么大问题。我遇到的问题是当我向模型添加属性,然后运行“添加迁移”时,它需要花费太长时间。它已经运行了大约40分钟,我正在做的就是创建一个列....它仍然没有完成。关于如何加快这一进程的任何想法。或者甚至可以手动创建这些迁移的方法(截至目前,我可能更容易输入AddColumn和DropColumn,而不是EF自动执行)。请帮忙,我想把这个提交给我的老板作为一个可行的选择。

c# entity-framework
2个回答
1
投票

我猜你已经在一个与你的入口点(即你的网络应用程序,控制台应用程序等)分开的程序集中定义了你的模型。

在数据程序集中创建一个新的app.config并至少定义:

<configuration>
  <connectionStrings>
    <add name="MyDB" connectionString="Data Source=localhost; Initial Catalog=MyDB; Integrated Security=SSPI; MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>

在调用add-migration或update-database时,有时还需要定义连接字符串名称:

Update-Database -ConnectionStringName MyDB
Add-Migration MyMigration -ConnectionStringName MyDB

我无法弄清楚需要这个配置的不同之处。

当EF无法联系您的数据库以尝试从中获取某些信息时,似乎会发生添加迁移的缓慢,因此它会等待超时,然后再回到它已经知道的数据库。您可能会发现在这种情况下您无法调用Update-Database - 这就是原因。


1
投票

扩展先前的答案。在数据项目的csproj文件中,您可能需要多目标,如:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netcoreapp2.0;netstandard2.0</TargetFrameworks>
  </PropertyGroup>
  ...
</Project>

我还发现我需要添加一个IDesignTimeContextFactory,如:

public class MyDbContextDesignTimeFactory : IDesignTimeDbContextFactory<LocationsDbContext>
{
    public MyDbContext CreateDbContext(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<MyDbContext>();
        //TODO - use configuration file/environment variable
        return new MyDbContext(optionsBuilder.Options, new RepositoryConfiguration()
        {
            DefaultConnectionString = "theConnectionString"
        });
    }
}

*在这种情况下,我使用的是MySql Connector,它在DbContext的OnConfiguring方法中配置连接字符串,因此通常会注入配置,因此可以在该方法中使用它。

然后我可以在终端cd到数据项目根目录并发出一个“普通”命令行,如:

dotnet ef migrations add InitialMigration

它比试图使用--startup-project选项运行得快得多。

© www.soinside.com 2019 - 2024. All rights reserved.