我在1.9.1中创建了一个自定义模块,它按照普通协议通过迁移文件将几个表插入数据库。我发现的是,Orchard错误地将[...在我看来]模块声称为“启用”太早:IFeatureEventHandler>启用,因为当触发此操作时,迁移会话甚至没有完成[即虽然Orchard的版本控制系统/已启用等等,否则提交尚未发生且您的表格不在数据库中。]
因此,依赖于这些表的任何后续代码显然都会引发错误。
有没有人有一个万无一失的方法来确保迁移成功运行并确实已经提交到数据库中[即在AutomaticDataMigrations(来自Orchard.Framework)完成后,我可以运行进一步明显依赖于这些表的代码吗?
我已经调试了SessionLocator.cs的高低任何想法,但是实体类型似乎偶尔会被创建,我无法想出一个好的钩子让我知道我的模块何时进入会话?
我真的不希望将我需要在迁移后立即启动的代码分离到一个单独的模块中,然后依赖于当前模块,即使我这样做了,我也不相信它会工作。 [目前,我在初始迁移真正提交后手动更新UpdateFrom#方法。]
感谢您的时间和任何建议。
更新: 因为这很可能是一个错误,这里有一些临时代码,我用来帮助我;)
namespace Test.Infrastructure
{
public class Shell : IOrchardShellEvents {
private readonly IDbMap _dbMap;
public static bool EaActivate { get; set; }
public Shell(IDbMap dbMap)
{
_dbMap = dbMap;
}
public static bool EaModuleState(bool state)
{
return EaActivate = state;
}
//IOrchardShellEvents:
public void Activated() {
if (EaActivate) {
_dbMap.AlterDB();
EaActivate = false;
}
}
public void Terminating() { }
}
public class FeatureMod : IFeatureEventHandler {
public void Installing(Feature feature) { }
public void Installed(Feature feature) { }
public void Enabling(Feature feature) { }
public void Enabled(Feature feature) {
if (feature.Descriptor.Id == "Test") {
Shell.EaModuleState(true);
}
}
public void Disabling(Feature feature) { }
public void Disabled(Feature feature) { }
public void Uninstalling(Feature feature) { }
public void Uninstalled(Feature feature) { }
}
}