2012-03-15 16 views
8

注入IRepositoryを使用してOrchard DBから直接データを取得してプッシュするカスタムモジュールを作成しています。オーチャードCMS - 移行後に新しいプロパティが更新されない

これは、コンテンツ部分を更新する必要があるまでうまく動作します。マイグレーションクラスに更新プログラムを追加し、更新プログラム(既定値で更新されたDBスキーマ)を実行しますが、IRepositoryを使用して新しい値を更新することはできません。私はNHibernateに落とさなければなりません。

これは新しく作成されたレシピですべて正常に動作しますが、これは部品を変更したときだけです。ここでは、キーコードスニペットです:

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」を追加すると、更新が実行された後、カラムはDBに表示されますが、私はオーチャードレシピを再作成するまで、私は(それらを更新することはできません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思われる...

乾杯。私はまだオーチャード1.3.9に多くの試験後

PPSを実行している

PSは、NHibernateの修正は現在、動作を停止しましたので、おそらく私の最初の発見は、赤いニシンでした。これは、コンテンツ部分の新しいプロパティが、更新/取得時に、オブジェクト定義がどこかにキャッシュされているかのように、NHibernateによって完全に無視されているかのようです...

答えて

8

あなたのマッピングが奇妙です。 app_dataフォルダー内のmappings.binを削除し、アプリケーションを再起動して強制的に実行することができます。 Orchardはnhibernateマッピングを再作成し、mappings.binとして保存する必要があります。

+2

この情報に感謝して、ここでマッピングが維持されていることを認識していませんでした。このファイルを削除し、モジュールを無効にしたり有効にしたりすることは、これが私が探している答えではないと確信していましたが、私はオーチャードのプロセスを迂回しているのか疑問に思っています。 –

+0

私はこの同じ問題を抱えていることが分かりました。あなたのソリューションはうまくいきましたが、@MikeSimmonsのように、私はこの方法がこれを実現するために奇妙な方法であることを発見しました。これは本当に最善の方法ですか? FYI - Orchard 1.6を使用しています。 – bigmac

+0

私はオーチャード1を走っています。10と私の 'ContentPart'にプロパティを追加し、私もマッピングファイルを削除しなければならないことがわかりました。これは心配です。モジュールをリリースしたいからアップグレードが難しいからです。 – hsimah

2

私は同じ問題に遭遇しました。私が見つけることができる唯一の方法は、mappings.binを削除することです(モジュールを無効にして再度有効にする必要はありません)。実際には、なぜこれが起きているのか尋ねたとき、バートランドから得た答えです。

http://orchard.codeplex.com/workitem/19306に問題として報告しました。もしあなたがこれを投票することができれば、それはもっと早く見えるかもしれません。

0

これは、ジョシュ

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

... ...私はあなたがモジュールを有効にすると、それはマイグレーションを実行する前に、NHibernateのマッピングを実行することを見ています私が見ていたものに、同様の問題のように思えます

関連する問題