2012-03-15 11 views
8

के बाद अपडेट नहीं कर रहे हैं मैं एक कस्टम मॉड्यूल लिख रहा हूं जो इंजेक्शन आईआरपीोजिटरी का उपयोग करके ऑर्चर्ड डीबी से सीधे डेटा को पुनर्प्राप्त और धक्का देता है।ऑर्चर्ड सीएमएस - नए गुण माइग्रेशन

यह तब तक ठीक काम करता है जब तक मुझे सामग्री भाग को अपडेट करने की आवश्यकता न हो। मैं अपने माइग्रेशन क्लास में एक अपडेट जोड़ता हूं और अपडेट (डीबी स्कीमा डिफ़ॉल्ट मानों के साथ अपडेट किया जाता है) के माध्यम से चलता है, हालांकि मैं आईरिपॉजिटरी के माध्यम से किसी भी नए मान को अपडेट नहीं कर सकता। मुझे परिवर्तनों को फ्लश करने के लिए 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; 
    } 
} 

जब मैं के बाद अद्यतन कॉलम चलाया जाता है, इस उदाहरण में दूसरी संपत्ति "ProductDescription" जोड़ने डीबी में दिखाई देते हैं, लेकिन मैं उन्हें अद्यतन नहीं कर सकते जब तक मैं ऑर्चर्ड नुस्खा पुन: (: यहाँ कुंजी कोड के टुकड़े कर रहे हैं ब्लैप 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(); 

जो थोड़ा kludgey लगता है ...

चीयर्स।

ps मैं अभी भी अधिक परीक्षण के बाद ऑर्चर्ड 1.3.9

पी पी एस चल रहा हूँ, NHibernate ठीक अब काम करना बंद कर दिया है, इसलिए शायद मेरी प्रारंभिक निष्कर्षों एक रेड हेरिंग थे। ऐसा प्रतीत होता है कि सामग्री भाग पर नई गुणों को एनएचबीर्नेट द्वारा पूरी तरह से अनदेखा किया जाता है जब अद्यतन/पुनर्प्राप्ति होती है - हालांकि ऑब्जेक्ट परिभाषा कहीं कैश की जाती है ...

उत्तर

8

यदि आपके मैपिंग अपडेट नहीं किए जा रहे हैं तो यह अजीब है। आप app_data फ़ोल्डर में mappings.bin को हटाकर और एप्लिकेशन को पुनरारंभ करके इसे मजबूर करने का प्रयास कर सकते हैं। ऑर्चर्ड को निबर्ननेट मैपिंग को फिर से बनाना चाहिए और मैपिंग्स.बिन के रूप में सहेजना चाहिए।

+2

उस जानकारी के लिए धन्यवाद, यह नहीं पता था कि मैपिंग यहां जारी रहे थे। इस फ़ाइल को हटाने, फिर मॉड्यूल को अक्षम/सक्षम करने से चाल चल रही थी, हालांकि यह विश्वास नहीं था कि यह वह उत्तर है जिसे मैं ढूंढ रहा हूं :) मैं बस सोच रहा हूं कि क्या मैं इस तरह से ऑर्चर्ड प्रक्रिया को रोक रहा हूं? –

+0

मैंने पाया कि मैं इस मुद्दे पर चल रहा हूं, और आपका समाधान काम करता है, लेकिन बस @ माइकसिमन्स की तरह, मुझे यह तरीका यह पूरा करने का एक अजीब तरीका लगता है। क्या यह वास्तव में सबसे अच्छी विधि है? एफवाईआई - मैं ऑर्चर्ड 1.6 का उपयोग कर रहा हूं। – bigmac

+0

मैं ऑर्चर्ड 1 चला रहा हूं।10 और बस मेरे 'ContentPart' में एक संपत्ति जोड़ा और पाया कि मुझे मैपिंग फ़ाइल को भी हटाना पड़ा। यह एक चिंता है, क्योंकि मैं अपना मॉड्यूल जारी करना चाहता हूं और इससे उन्नयन मुश्किल हो जाएगा। – hsimah

2

मैं एक ही समस्या में भाग गया हूं, और मैपिंग.बिन को हटाने के लिए एकमात्र तरीका है (मुझे मॉड्यूल को अक्षम और पुनः सक्षम करने की आवश्यकता नहीं है)। असल में, यह जवाब है कि मुझे बर्ट्रैंड से मिला जब मैंने पूछा कि यह क्यों हो रहा था।

मैंने इसे http://orchard.codeplex.com/workitem/19306 पर एक समस्या के रूप में लॉग किया है। यदि आप इसे वोट दे सकते हैं, तो हम इसे जल्दी से देख सकते हैं।

0

यह वही है मैं देख रहा हूँ ... मुझे लगता है कि जब आप एक मॉड्यूल सक्षम दिखाई दे रहा है, यह माइग्रेशन चलाने से पहले NHibernate मैपिंग चलाता है के लिए इसी तरह की एक मुद्दा की तरह लगता है ..

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

जोश

संबंधित मुद्दे