2012-03-15 20 views
8

Enjekte Edilmiş bir İkincil Deposu kullanarak doğrudan Orchard DB'den verileri alıp gönderen özel bir modül yazıyorum.Orchard CMS - geçişten sonra güncellenmeyen yeni özellikler

Bu, bir içerik bölümünü güncellemeye gerek kalmadan iyi çalışıyor. Geçişlerim sınıfında bir güncelleme ekliyorum ve güncelleme çalışıyor (DB şeması varsayılan değerlerle güncellendi), ancak yeni değerleri IRepository yoluyla güncelleyemiyorum. Değişimleri yıkamak için NHibernate.ISession içine düşmem gerekiyor.

Bu, yeni oluşturulmuş bir tarifte düzgün çalışıyor, yalnızca bir parçayı değiştirdiğimde.

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

güncelleme sütunları çalıştırıldıktan sonra ben, bu örnekte ikinci özelliği "ProductDescription" eklemek

DB görünür ama Orchard tarifi yeniden dek i (Güncellememeniz edebilirsiniz: İşte anahtar kod parçacıkları şunlardır App_Data blat ve tekrar başlatın).

// 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(); 
    } 

ve burada NHibernate "düzeltme" var: Burada

Güncelleme için çalışıyorum nasıl

biraz kludgey görünüyor
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(); 

...

Şerefe. ben hala daha test ettikten sonra Orchard 1.3.9

pps koşuyorum

ps NHibernate düzeltme belkide benim ilk bulgular, kırmızı ringa vardı şimdi çalışmayı durdurdu. Bu içerik bölümündeki yeni özellikler güncellenirken/alınırken NHibernate tarafından tamamen göz ardı ediliyormuş gibi görünüyor - nesne tanımı bir yerde önbelleğe alınmış gibi ...

cevap

8

Haritalarınız garip güncellenmiyorsa. App_data klasöründeki mappings.bin dosyasını silerek ve uygulamayı yeniden başlatarak zorlamayı deneyebilirsiniz. Orchard nhibernate mappings yeniden oluşturmalı ve mappings.bin olarak kaydetmelisiniz.

+2

Bu bilgi için teşekkürler, eşlemelerin burada devam ettiğini fark etmediniz. Bu dosyayı silmek, daha sonra modülün devre dışı bırakılması/devre dışı bırakılması hile yaptı, buna ikna olmadığına inanıyorum çünkü aradığım cevap :) Ben sadece Orchard sürecini böyle yaparak halledeyim mi diye merak ediyorum. –

+0

Bu aynı sorunla karşılaştığımı ve çözümün işe yaradığını buldum, ancak tıpkı @MikeSimmons gibi, bu yöntemin bunu başarmak için garip bir yol olduğunu düşünüyorum. Bu gerçekten en iyi yöntem mi? FYI - Orchard 1.6 kullanıyorum. – bigmac

+0

Orchard 1'i çalıştırıyorum.10 ve 'ContentPart'ma bir özellik ekledim ve eşleme dosyasını da silmek zorunda kaldım. Bu bir endişe, çünkü modülümü serbest bırakmak istiyorum ve bu da yükseltmeleri zorlaştırıyor. – hsimah

2

Aynı soruna rastladım ve bulabildiğim tek yol mappings.bin dosyasını silmektir (modülü devre dışı bırakmak ve yeniden etkinleştirmem gerekmez). Aslında, bunun neden olduğunu sorduğumda Bertrand'dan aldığım cevap bu.

Bunu bir sorun olarak bildirdim http://orchard.codeplex.com/workitem/19306. Buna oy verebilseydin, daha hızlı bakabiliriz.

0

Bu, bu göçler çalışan ÖNCE NHibernate eşleştirmeleri ishal ne ... Sana bir modül etkinleştirdiğinizde o görüyorum görüyorum benzer sorun gibi görünüyor ..

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

Josh

İlgili konular