@@ -309,7 +309,7 @@ protected override void DeleteItem(T entity)
309309
310310 if ( IsValidKey ( pkValue ) )
311311 {
312- var keyPropertyName = BsonClassMap . LookupClassMap ( typeof ( T ) ) . IdMemberMap . ElementName ;
312+ var keyPropertyName = BsonClassMap . LookupClassMap ( typeof ( T ) ) . IdMemberMap . MemberName ;
313313 var keyPair = GetMongoProperty ( entity , keyPropertyName ) ;
314314 var filter = Builders < T > . Filter . Eq ( keyPair . Key , keyPair . Value ) ;
315315
@@ -323,8 +323,11 @@ protected override void UpdateItem(T entity)
323323 GetPrimaryKey ( entity , out pkValue ) ;
324324 if ( IsValidKey ( pkValue ) )
325325 {
326- var keyPropertyName = BsonClassMap . LookupClassMap ( typeof ( T ) ) . IdMemberMap . ElementName ;
327- var keyPair = GetMongoProperty ( entity , keyPropertyName ) ;
326+ var keyMap = BsonClassMap . LookupClassMap ( typeof ( T ) ) . IdMemberMap ;
327+ var keyPropertyName = keyMap . MemberName ;
328+ var keyBsonType = ( ( StringSerializer ) keyMap . GetSerializer ( ) ) . Representation ;
329+ var keyBsonPropertyValue = BsonTypeMapper . MapToBsonValue ( pkValue , keyBsonType ) ;
330+ var keyPair = new KeyValuePair < string , BsonValue > ( keyPropertyName , keyBsonPropertyValue ) ;
328331 var filter = Builders < T > . Filter . Eq ( keyPair . Key , keyPair . Value ) ;
329332
330333
@@ -344,13 +347,39 @@ protected override void UpdateItem(T entity)
344347 public static KeyValuePair < string , BsonValue > GetMongoProperty ( T entity , string propertyName )
345348 {
346349 var value = typeof ( T ) . GetProperty ( propertyName ) . GetValue ( entity ) ;
347- var memberMap = BsonClassMap . LookupClassMap ( typeof ( TKey ) ) . GetMemberMap ( propertyName ) ;
348- var keyBsonType = ( ( StringSerializer ) memberMap . GetSerializer ( ) ) . Representation ;
349- var bsonPropertyValue = BsonTypeMapper . MapToBsonValue ( value , keyBsonType ) ;
350-
350+ var memberMap = BsonClassMap . LookupClassMap ( typeof ( T ) ) . GetMemberMap ( propertyName ) ;
351+ var memberBsonType = GetBsonType ( value , memberMap ) ;
352+
353+ // some "non-string types are mapped to string"
354+ if ( memberBsonType == BsonType . String )
355+ {
356+ value = value . ToString ( ) ;
357+ }
358+
359+ var bsonPropertyValue = BsonTypeMapper . MapToBsonValue ( value , memberBsonType ) ;
351360 return new KeyValuePair < string , BsonValue > ( propertyName , bsonPropertyValue ) ;
352361 }
353362
363+ protected static BsonType GetBsonType ( object value , BsonMemberMap memberMap )
364+ {
365+ BsonType keyBsonType ;
366+
367+ if ( value == null ) {
368+ keyBsonType = BsonType . Null ;
369+ } else {
370+ var propertyInfo = memberMap . GetSerializer ( ) . GetType ( ) . GetProperty ( "Representation" ) ;
371+ if ( propertyInfo != null )
372+ {
373+ keyBsonType = ( BsonType ) propertyInfo . GetValue ( memberMap . GetSerializer ( ) ) ;
374+ } else
375+ {
376+ keyBsonType = BsonType . Array ;
377+ }
378+ }
379+
380+ return keyBsonType ;
381+ }
382+
354383 protected override void SaveChanges ( )
355384 {
356385 }
0 commit comments