2012-03-15 52 views
8

我正在写一个自定义模块,它使用注入的IRepository从Orchard DB直接检索和推送数据。Orchard CMS - 迁移后不更新的新属性

这工作正常,直到我需要更新内容部分。我在我的迁移类中添加了一个更新,并且更新通过(使用默认值更新的数据库模式),但是我无法通过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; 
    } 
} 

当我在这个例子中添加第二个属性“产品描述”中,更新运行列之后出现在DB但直到我重新果园配方我不能更新它们( 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的 “修复”:

​​

这似乎有点kludgey ...

干杯。

PS我更多的测试后,我仍然运行果园1.3.9

PPS,NHibernate的补丁现在已经不再工作,所以也许我的初步调查结果是一个红鲱鱼。好像NHibernate在更新/检索时完全忽略了内容部分的新属性 - 好像对象定义缓存在某处...

回答

8

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

+2

感谢那个信息,没有意识到映射被持续在这里。删除这个文件,然后禁用/启用模块做了窍门,虽然不相信这是我正在寻找的答案:)我只是想知道如果我这样做是否绕过Orchard进程? – 2012-03-16 09:45:57

+0

我发现我遇到了同样的问题,并且你的解决方案能够工作,但就像@MikeSimmons一样,我发现这种方法是一种奇怪的方法来实现这一点。这真的是最好的方法吗?仅供参考 - 我正在使用Orchard 1.6。 – bigmac 2012-11-14 03:02:00

+0

我正在运行果园1。10,并在我的'ContentPart'中添加了一个属性,发现我也必须删除这个映射文件。这是一个担心,因为我想释放我的模块,这会使升级变得困难。 – hsimah 2016-04-27 09:00:02

2

我遇到了同样的问题,我可以找到的唯一方法是删除mappings.bin(我不需要禁用并重新启用模块)。事实上,当我问及为什么会发生这种情况时,这是我从伯特兰得到的答案。

我已经在http://orchard.codeplex.com/workitem/19306上登录过这个问题。如果您可以对此进行投票,那么我们可能会更快地看到它。