當 db 上下文配置為 時,遷移的順序是MigrateDatabaseToLatestVersion
什麼?自動生成的遷移類似乎不包含任何排序。唯一似乎對訂單有線索的地方是遷移文件名/時間戳——但這在運行時似乎不太可能或不可用......對嗎?
初始遷移名稱是實際使用的東西。這也與初始文件名相同,但您顯然可以更改它。
在 EntityFramework 中,當您生成遷移時,您可能熟悉編輯文件以自定義遷移。
public partial class InitialCreate : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.Blogs",
c => new
{
BlogId = c.Int(nullable: false, identity: true),
Name = c.String(),
})
.PrimaryKey(t => t.BlogId);
}
public override void Down()
{
DropTable("dbo.Blogs");
}
}
但是還會生成一個設計器文件,它有一些您不應編輯的屬性:
[GeneratedCode("EntityFramework.Migrations", "6.4.4")]
public sealed partial class InitialCreate : IMigrationMetadata
{
private readonly ResourceManager Resources = new ResourceManager(typeof(InitialCreate));
string IMigrationMetadata.Id
{
get { return "202111200213248_InitialCreate"; }
}
string IMigrationMetadata.Source
{
get { return null; }
}
string IMigrationMetadata.Target
{
get { return Resources.GetString("Target"); }
}
}
在EF6的源代碼中,您可以看到遷移反映在您的遷移程序
集中DbMigration
:使用繼承自的每個類,然後按Id
屬性排序。
_migrations
= (from t in migrationsAssembly.GetAccessibleTypes()
where t.IsSubclassOf(typeof(DbMigration))
&& typeof(IMigrationMetadata).IsAssignableFrom(t)
&& t.GetPublicConstructor() != null
&& !t.IsAbstract()
&& !t.IsGenericType()
&& t.Namespace == migrationsNamespace
select (IMigrationMetadata)Activator.CreateInstance(t))
.Where(mm => !string.IsNullOrWhiteSpace(mm.Id) && mm.Id.IsValidMigrationId())
.OrderBy(mm => mm.Id)
.ToList();
即使您重命名文件,在Id
創建遷移時仍將具有其初始值,並按照 EF6 所見的詞法和時間順序保持遷移。
EFCore 幾乎相同,只是它已從設計器文件上的屬性移動到屬性:
[DbContext(typeof(MyContext))]
[Migration("20211118001328_InititialCreate")]
partial class Init {}
而EFCore查找,從繼承的類,屬性Migration
。
var items
= from t in Assembly.GetConstructibleTypes()
where t.IsSubclassOf(typeof(Migration))
&& t.GetCustomAttribute<DbContextAttribute>()?.ContextType == _contextType
let id = t.GetCustomAttribute<MigrationAttribute>()?.Id
orderby id
select (id, t);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句