2011-09-16 17 views
8

joliver/EventStore में मोंगोडीबी दृढ़ इंजन का उपयोग करके Unknown discriminator value 'MyEvent' त्रुटि उत्पन्न हुई। समस्या केवल तब होता है जब मैं मुद्दों की तरह this.storeEvent.Advanced.GetFrom(new DateTime(2010, 1,1))अज्ञात भेदभाव मूल्य 'MyEvent'

घटनाओं पुनः के लिए सभी घटनाओं लोड करने के लिए ExtensionsMethods.cs में कारण होता है

public class MyClassEvent : IDomainEvent { ... } 

public static Commit ToCommit(this BsonDocument doc, IDocumentSerializer serializer) 
    { 
     if (doc == null) 
      return null; 

     var id = doc["_id"].AsBsonDocument; 
     var streamId = id["StreamId"].AsGuid; 
     var commitSequence = id["CommitSequence"].AsInt32; 

     var events = doc["Events"].AsBsonArray.Select(e => e.AsBsonDocument["Payload"].IsBsonDocument ? BsonSerializer.Deserialize<EventMessage>(e.AsBsonDocument["Payload"].AsBsonDocument) : serializer.Deserialize<EventMessage>(e.AsBsonDocument["Payload"].AsByteArray)).ToList(); 
     var streamRevision = doc["Events"].AsBsonArray.Last().AsBsonDocument["StreamRevision"].AsInt32; 
     return new Commit(
      streamId, 
      streamRevision, 
      doc["CommitId"].AsGuid, 
      commitSequence, 
      doc["CommitStamp"].AsDateTime, 
      BsonSerializer.Deserialize<Dictionary<string, object>>(doc["Headers"].AsBsonDocument), 
      events); 
    } 

मेरे विन्यास इस तरह है कोशिश:

Wireup.Init()     
      .UsingMongoPersistence(connectionName, new DocumentObjectSerializer()) 
      .UsingBsonSerialization()  
      .UsingAsynchronousDispatcher()         
      .PublishTo(this.container.Resolve<IPublishMessages>()) 
      .Build(); 

लेकिन लगभग सभी तरह के serializer विकल्पों की कोशिश की है।

उत्तर

10

BsonClassMap.RegisterClassMap विधि का उपयोग करके अपनी ऑब्जेक्ट्स (स्वयं ईवेंट संदेश के साथ-साथ EventStore पेलोड के विषयों) को पंजीकृत करने का प्रयास करें। ऐसा लगता है कि इवेंटस्टोर का मोंगो एक्सटेंशन स्ट्रिंग पेलोड को अच्छी तरह से संभालता है, लेकिन deserialized वस्तुओं नहीं ... कम से कम वर्गीकृत पंजीकरण मेरे मामले में समाधान था।

+2

धन्यवाद। जब मैंने कामों को बचाया, तो मोंगो डीबी चालक ने कक्षाएं खुद पंजीकृत की, हालांकि जवाब (शुद्ध पढ़ने) पर मानचित्रण नहीं किया गया था। – Jacee

+0

धन्यवाद, हालांकि मैं नहीं देख सकता कि यह आवश्यक क्यों होना चाहिए – JacobE

13

मैं बस इसमें भी भाग गया। Zsolt's उत्तर एक अच्छा प्रारंभिक बिंदु था, लेकिन मैं इसे थोड़ा अलग हल करने के लिए समाप्त हो गया।

ध्यान दें कि मुझे यह नहीं मिला जब myEventStore.Advanced.GetFrom(...); myEventStore.OpenStream(...) भी विफल रहता है। यह समझ में आता है, क्योंकि दोनों विधियां एक ही IPersistentStream और सीरिएलाइज़र का उपयोग करती हैं।

मैं इस समस्या में तब नहीं चलता जब मैं पहली बार एक घटना को जारी रखता हूं, उसी प्रकार की घटना को पुनर्प्राप्त करने से पहले। स्पष्ट रूप से MongoDB एक ClassMap बनाता है जब इसे पहली बार एक प्रकार का क्रमबद्ध करने के लिए कहा जा रहा है।

वैसे भी, मेरे लिए समाधान एप्लिकेशन स्टार्टअप पर मेरे सभी ईवेंट प्रकारों के लिए क्लास मैप बनाना था। सभी प्रकार मान लिया जाये कि SimpleCQRS.Event की विधानसभा में हैं और SimpleCQRS.Event से निकाले जाते हैं, मैं इसे इस तरह कार्य करें:

var types = Assembly.GetAssembly(typeof(SimpleCQRS.Event)) 
        .GetTypes() 
        .Where(type => type.IsSubclassOf(typeof(SimpleCQRS.Event))); 
foreach (var t in types) 
    BsonClassMap.LookupClassMap(t); 

मेरे लिए इस BsonClassMap.RegisterClassMap<TypeToMap> तरह ज़ोल्ट पता चलता है का उपयोग करने से बेहतर काम करता है, क्योंकि वह एक सामान्य प्रकार पैरामीटर की आवश्यकता है, जिसका अर्थ है आपको manually add each event type होना है।

+0

+1 मेरे लिए भी काम किया! – RobertMS

+0

उत्कृष्ट भविष्यरोधी विचार, केवल कुछ छोटे ठीक प्रिंट/चेतावनी के साथ ए) सभी 'SimpleCQRS.Event' उप-वर्गों को अंधाधुंध रूप से जोड़ा जाएगा, और यह बी) कि सभी' ज्ञात प्रकार 'उप-वर्गों को एक ही असेंबली में रहना चाहिए। – StuartLC

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