2014-12-18 12 views
6

że dwie klasy, na przykład:Korzystanie z C# MongoDB Driver, jak serializować zbiór referements obiektów?

public class A 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
    // Other properties... 
} 

public class B 
{ 
    public string Id { get; set; } 
    public ICollection<A> ReferredAObjects { get; set; } 
    // Other properties... 
} 

mam tworzenia map z BsonClassMap.RegisterClassMap (klasy) w A i B, ponieważ przechowywane są podzielone na zbiory względnych.

Problem zaczyna się, gdy próbuję mapować B, ponieważ muszę zmapować kolekcję A jako odniesienia do zewnętrznych dokumentów z dodatkowymi informacjami, więc w tym przypadku muszę odwzorować tylko identyfikatory i nazwy.

Jak utworzyć mapę klas dla B, która używa innego mapowania dla A tylko wewnątrz?

Odpowiedz

4

BsonClassMap nie jest rozwiązaniem, należy napisać swój zwyczaj IBsonSerializer dla B klasy Właśnie implemeted się Serialize metodzie Deserilze prace samo.

public class BSerialzer : IBsonSerializer 
{ 
    public object Deserialize(BsonReader bsonReader, Type nominalType, IBsonSerializationOptions options) 
    { 
     throw new NotImplementedException(); 
    } 

    public object Deserialize(BsonReader bsonReader, Type nominalType, Type actualType, IBsonSerializationOptions options) 
    { 
     throw new NotImplementedException(); 
    } 

    public IBsonSerializationOptions GetDefaultSerializationOptions() 
    { 
     throw new NotImplementedException(); 
    } 

    public void Serialize(BsonWriter bsonWriter, Type nominalType, object value, IBsonSerializationOptions options) 
    { 
     var b = (B)value; 
     bsonWriter.WriteStartDocument(); 

     bsonWriter.WriteString("_id", b.Id);    
     bsonWriter.WriteStartArray("refs"); 
     foreach (var refobj in b.ReferredAObjects) 
     { 
      bsonWriter.WriteString(refobj.Id); 
     } 
     bsonWriter.WriteEndArray();    

     bsonWriter.WriteEndDocument(); 
    } 
} 

dla próbki poniżej obiektów

var a0 = new A 
{ 
    Id = "0", 
    Name = "0", 
}; 

var a1 = new A 
{ 
    Id = "1", 
    Name = "1", 
}; 

var b = new B 
{ 
    Id = "b0", 
    ReferredAObjects = new Collection<A> { a0, a1 } 
}; 

collection.Insert(b); 

będzie produkować wyjście jak:

{ 
    "_id" : "b0", 
    "refs" : [ 
     "0", 
     "1" 
    ] 
} 

Wystarczy pamiętać, aby zarejestrować ten Sterilizer w programie start-up:

BsonSerializer.RegisterSerializer(typeof(B), new BSerialzer()); 
+0

Ok , Potrzebuję też zapisać imię związane z Id, ale zrozumiałem tę metodę! Dziękuję Ci! – tmm360