【问题标题】:Orchard CMS - new properties not updating after migrationOrchard CMS - 迁移后未更新的新属性
【发布时间】:2012-03-15 09:29:13
【问题描述】:

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

在我需要更新内容部分之前,这可以正常工作。我在我的迁移类中添加了一个更新,并且更新贯穿(使用默认值更新的数据库架构),但是我无法通过 IRepository 更新任何新值。我必须下拉到 NHibernate.ISession 以刷新更改。

这一切都适用于新创建的配方,只有当我改变一个部分时。这里是关键代码sn-ps:

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;
    }
}

当我在此示例中添加第二个属性“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();
    }

这里是 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();

这似乎有点笨拙......

干杯。

ps 我还在运行 Orchard 1.3.9

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

【问题讨论】:

    标签: orchardcms


    【解决方案1】:

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

    【讨论】:

    • 感谢您提供的信息,没有意识到映射被保留在这里。删除这个文件,然后禁用/启用模块就可以了,虽然不相信这是我正在寻找的答案:) 我只是想知道我是否通过这样做来绕过 Orchard 进程?
    • 我发现我遇到了同样的问题,并且您的解决方案有效,但就像@MikeSimmons 一样,我发现这种方法是一种奇怪的方法来完成此任务。这真的是最好的方法吗?仅供参考 - 我正在使用 Orchard 1.6。
    • 我正在运行 Orchard 1.10,刚刚向我的 ContentPart 添加了一个属性,发现我还必须删除映射文件。这是一个担心,因为我想发布我的模块,这会使升级变得困难。
    【解决方案2】:

    我遇到了同样的问题,我能找到的唯一解决方法是删除 mappings.bin(我不需要禁用和重新启用该模块)。事实上,当我问为什么会发生这种情况时,这就是我从 Bertrand 那里得到的答案。

    我已将此问题记录为http://orchard.codeplex.com/workitem/19306。如果你能投票赞成,那么我们可能会更快地看到它。

    【讨论】:

      【解决方案3】:

      这似乎与我所看到的类似...我看到当您启用一个模块时,它会在运行迁移之前运行 NHibernate 映射..

      https://orchard.codeplex.com/workitem/19603

      乔什

      【讨论】:

        【解决方案4】:

        更新PersistenceConfiguration类中ComputingHash方法中的hash值, 更新哈希值可能会重新创建 mappings.bin 文件。

            public class PersistenceConfiguration : ISessionConfigurationEvents
            {
              public void Created(FluentConfiguration cfg, AutoPersistenceModel defaultModel)
              {
                  DoModelMapping(cfg, defaultModel);
              }
        
              public void ComputingHash(Hash hash)
              {
                  hash.AddString("Some_strings_to_update_hash");
              }
        
              private void DoModelMapping(FluentConfiguration cfg, AutoPersistenceModel defaultModel)
              {
        
                     // mappings here....
              }
        
              public void Prepared(FluentConfiguration cfg) { }
        
              public void Building(Configuration cfg) { }
        
              public void Finished(Configuration cfg) { }
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-27
          • 1970-01-01
          • 2014-07-16
          • 2016-02-06
          • 2023-04-05
          相关资源
          最近更新 更多