是否可以更改 EF 迁移“迁移”文件夹的位置?

Posted

技术标签:

【中文标题】是否可以更改 EF 迁移“迁移”文件夹的位置?【英文标题】:Is it possible to change the location of the EF Migrations "Migrations" folder? 【发布时间】:2012-01-22 16:38:39 【问题描述】:

默认情况下,add-migration 命令会尝试在其中创建迁移 .cs 文件

项目根目录 迁移

我想将我的迁移连同其他与 EF 相关的代码一起存储在我项目的 \Data 文件夹中:

项目根目录 数据 迁移

有了这个结构,当我执行时

PM> add-migration Migration1

在 NuGet 控制台中,我收到以下错误:

System.IO.DirectoryNotFoundException:找不到路径“C:\MyProjectRoot\Migrations\201112171635110_Migration1.cs”的一部分。 在 System.IO.__Error.WinIOError(Int32 错误代码,字符串可能全路径) 在 System.IO.FileStream.Init(字符串路径、FileMode 模式、FileAccess 访问、Int32 权限、Boolean useRights、FileShare 共享、Int32 bufferSize、FileOptions 选项、SECURITY_ATTRIBUTES secAttrs、String msgPath、Boolean bFromProxy、Boolean useLongPath) 在 System.IO.FileStream..ctor(字符串路径、FileMode 模式、FileAccess 访问、FileShare 共享、Int32 bufferSize、FileOptions 选项) 在 System.IO.StreamWriter.CreateFile(字符串路径,布尔附加) 在 System.IO.StreamWriter..ctor(字符串路径,布尔附加,编码编码,Int32 缓冲区大小) 在 System.IO.StreamWriter..ctor(字符串路径,布尔附加,编码编码) 在 System.IO.File.InternalWriteAllText(字符串路径,字符串内容,编码编码) 在 System.IO.File.WriteAllText(字符串路径,字符串内容)

是否可以在执行 add-migration 命令时指定要在磁盘上创建迁移文件的位置?

【问题讨论】:

请将 Roger 的解决方案标记为答案。它对我有用。谢谢。 【参考方案1】:

在配置类构造函数中添加这一行:

this.MigrationsDirectory = "DirOne\\DirTwo";

命名空间将继续设置为配置类本身的命名空间。要更改这一点,请添加此行(也在配置构造函数中):

this.MigrationsNamespace = "MyApp.DirOne.DirTwo";

【讨论】:

+1 为我省去了很多麻烦。我浏览了所有 Pluralsight 视频,试图找到一个不继承迁移文件夹位置的默认配置的示例。你是救生员。 有没有办法在web.config文件中指定这个? 这个配置类在哪里? 路径是相对于项目根目录的,所以@"Migrations\Context1" 是一个示例路径。如果您在第一次成功创建文件后立即收到关于文件已经存在的奇怪错误,那么您可能错误地输入了@"Migrations\\Context1"。 (***.com/a/30787200/16940)【参考方案2】:

在调用enable-migrations 命令(创建Configuration 类)期间也可以使用-MigrationsDirectory 参数指定迁移文件夹:

enable-migrations -EnableAutomaticMigration:$false -MigrationsDirectory Migrations\CustomerDatabases -ContextTypeName FullyQualifiedContextName

该示例将创建一个Configuration 类,将MigrationsDirectory 设置为相对于项目根文件夹的指定文件夹“Migrations\CustomerDatabases”。

public Configuration()

    AutomaticMigrationsEnabled = false;
    MigrationsDirectory = @"Migrations\CustomerDatabases";

另请参阅 this 文章,该文章解释了具有多个上下文和迁移文件夹的项目。

顺便说一下,如果您使用多个迁移文件夹和多个上下文,请考虑在您的DbContext 派生类的OnModelCreating 方法中为默认架构设置一个名称(其中 Fluent-API 配置是)。 这将在 EF6 中工作:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    
        modelBuilder.HasDefaultSchema("CustomerDatabases");
    

将为您的数据库表添加模式名称的前缀。这将使您能够在一个数据库中使用多个上下文,其中您有几组独立于另一个的表。 (这也将创建 MigrationHistory 表的单独版本,在上面的示例中为 CustomerDatabases.__MigrationHistory)。

【讨论】:

以上是关于是否可以更改 EF 迁移“迁移”文件夹的位置?的主要内容,如果未能解决你的问题,请参考以下文章

“Dotnet ef 迁移添加”不创建迁移

将 EF 迁移合并到新的 InitialCreate

数据库优先方法的 EF 迁移?

如何更改Update-Database ef迁移的连接字符串?

EF Core 5.0 - 更改“定义查询”映射实体时是不是需要生成迁移?

添加新迁移时,EF 数据迁移不会检测到更改