注入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によって完全に無視されているかのようです...
この情報に感謝して、ここでマッピングが維持されていることを認識していませんでした。このファイルを削除し、モジュールを無効にしたり有効にしたりすることは、これが私が探している答えではないと確信していましたが、私はオーチャードのプロセスを迂回しているのか疑問に思っています。 –
私はこの同じ問題を抱えていることが分かりました。あなたのソリューションはうまくいきましたが、@MikeSimmonsのように、私はこの方法がこれを実現するために奇妙な方法であることを発見しました。これは本当に最善の方法ですか? FYI - Orchard 1.6を使用しています。 – bigmac
私はオーチャード1を走っています。10と私の 'ContentPart'にプロパティを追加し、私もマッピングファイルを削除しなければならないことがわかりました。これは心配です。モジュールをリリースしたいからアップグレードが難しいからです。 – hsimah