Orchard CMS - 迁移后不更新的新属性

Mik*_*ons 8 orchardcms

我正在编写一个自定义模块,使用注入的IRepository直接从Orchard DB检索和推送数据.

这工作正常,直到我需要更新内容部分.我在迁移类中添加了更新,并且更新运行(使用默认值更新的数据库模式),但是我无法通过IRepository更新任何新值.我必须进入NHibernate.ISession来刷新更改.

这一切都适用于新创建的配方,只有当我改变一个零件时才会这样.以下是关键代码段:

public class TranslationsPartRecord : ContentPartRecord
{
    internal const string DefaultProductName = "Product";

    public TranslationsPartRecord()
    {
        ProductName = DefaultProductName;
    }

    public virtual string ProductName { get; set; }
}

public class TranslationsPart : ContentPart<TranslationsPartRecord>
{
    public string ProductName
    {
        get { return Record.ProductName; }
        set { Record.ProductName = value; }
    }
}

public class TranslationsHandler : ContentHandler
{
    public TranslationsHandler(IRepository<TranslationsPartRecord> repository)
    {
        Filters.Add(StorageFilter.For(repository));
    }
}

public class Migrations : DataMigrationImpl
{
    public int Create()
    {
        SchemaBuilder.CreateTable("TranslationsPartRecord", table => table
            .Column<int>("Id", column => column.PrimaryKey().Identity())
            .Column("ProductName", DbType.String, column => column.NotNull().WithDefault(TranslationsPartRecord.DefaultProductName))
        );

        return 1;
    }

    public int UpdateFrom1()
    {
        SchemaBuilder.AlterTable("TranslationsPartRecord", table => table.AddColumn("ProductDescription", DbType.String, column => column.NotNull().WithDefault(TranslationsPartRecord.DefaultProductDescription)));

        return 2;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我在此示例中添加第二个属性"ProductDescription"时,在运行更新后,列会出现在数据库中但我无法更新它们,直到我重新创建Orchard配方(blat App_Data并再次启动).

这是我试图更新的方式:

// ctor
    public AdminController(IRepository<TranslationsPartRecord> translationsRepository)
    {
        _translationsRepository = translationsRepository;
    }

[HttpPost]
    public ActionResult Translations(TranslationsViewModel translationsViewModel)
    {
        var translations = _translationsRepository.Table.SingleOrDefault();
        translations.ProductName = translationsViewModel.ProductName;
        translations.ProductDescription = translationsViewModel.ProductDescription;

        _translationsRepository.Update(translations);
        _translationsRepository.Flush();
    }
Run Code Online (Sandbox Code Playgroud)

这是NHibernate的"修复":

var session = _sessionLocator.For(typeof(TranslationsPartRecord));

        var translations = _translationsRepository.Table.SingleOrDefault();

        // is translations.Id always 1?
        var dbTranslations = session.Get<TranslationsPartRecord>(translations.Id);

        dbTranslations.ProductName = translationsViewModel.ProductName;
        dbTranslations.ProductDescription = translationsViewModel.ProductDescription;

        session.Update(dbTranslations);
        session.Flush();
Run Code Online (Sandbox Code Playgroud)

这似乎有点kludgey ...

干杯.

ps我还在运行Orchard 1.3.9

pps经过更多测试后,NHibernate修复程序现已停止工作,所以也许我最初的发现是红鲱鱼.似乎NHibernate在更新/检索时完全忽略了内容部分的新属性 - 好像对象定义被缓存在某个地方......

Gis*_*mby 8

如果您的映射没有更新,那很奇怪.您可以尝试通过删除app_data文件夹中的mappings.bin并重新启动应用程序来强制它.Orchard应该重新创建nhibernate映射并保存为mappings.bin.

  • 谢谢你的信息,没有意识到这里的映射是持久的.删除这个文件,然后禁用/启用该模块就行了,虽然不相信这是我正在寻找的答案:)我只是想知道我是否通过这样做来绕过Orchard进程? (2认同)