@@ -13,6 +13,7 @@ function Instance(Model, opts) {
1313 opts . changes = ( opts . is_new ? Object . keys ( opts . data ) : [ ] ) ;
1414 opts . extrachanges = [ ] ;
1515 opts . associations = { } ;
16+ opts . originalKeyValues = { } ;
1617
1718 var instance_saving = false ;
1819 var events = { } ;
@@ -27,6 +28,14 @@ function Instance(Model, opts) {
2728 cb . apply ( instance , args ) ;
2829 } ) ;
2930 } ;
31+ var rememberKeys = function ( ) {
32+ var i , prop ;
33+
34+ for ( i = 0 ; i < opts . keyProperties . length ; i ++ ) {
35+ prop = opts . keyProperties [ i ] ;
36+ opts . originalKeyValues [ prop . name ] = opts . data [ prop . name ] ;
37+ }
38+ } ;
3039 var handleValidations = function ( cb ) {
3140 var pending = [ ] , errors = [ ] , required ;
3241
@@ -185,6 +194,8 @@ function Instance(Model, opts) {
185194 return nextHook ( ) ;
186195 } ;
187196 var saveNew = function ( saveOptions , data , cb ) {
197+ var i , prop ;
198+
188199 var finish = function ( err ) {
189200 runAfterSaveActions ( function ( ) {
190201 if ( err ) return cb ( err ) ;
@@ -194,16 +205,19 @@ function Instance(Model, opts) {
194205
195206 data = Utilities . transformPropertyNames ( data , Model . allProperties ) ;
196207
197- opts . driver . insert ( opts . table , data , opts . keys , function ( save_err , info ) {
208+ opts . driver . insert ( opts . table , data , opts . keyProperties , function ( save_err , info ) {
198209 if ( save_err ) {
199210 return saveError ( cb , save_err ) ;
200211 }
201212
202213 opts . changes . length = 0 ;
203- for ( var i = 0 ; i < opts . keys . length ; i ++ ) {
204- opts . data [ opts . keys [ i ] ] = info . hasOwnProperty ( opts . keys [ i ] ) ? info [ opts . keys [ i ] ] : data [ opts . keys [ i ] ] ;
214+
215+ for ( i = 0 ; i < opts . keyProperties . length ; i ++ ) {
216+ prop = opts . keyProperties [ i ] ;
217+ opts . data [ prop . name ] = info . hasOwnProperty ( prop . name ) ? info [ prop . name ] : data [ prop . name ] ;
205218 }
206219 opts . is_new = false ;
220+ rememberKeys ( ) ;
207221
208222 if ( saveOptions . saveAssociations === false ) {
209223 return finish ( ) ;
@@ -213,7 +227,7 @@ function Instance(Model, opts) {
213227 } ) ;
214228 } ;
215229 var savePersisted = function ( saveOptions , data , cb ) {
216- var changes = { } , conditions = { } ;
230+ var changes = { } , conditions = { } , i , prop ;
217231
218232 var next = function ( saved ) {
219233 var finish = function ( ) {
@@ -245,11 +259,12 @@ function Instance(Model, opts) {
245259 if ( opts . changes . length === 0 ) {
246260 next ( false ) ;
247261 } else {
248- for ( var i = 0 ; i < opts . changes . length ; i ++ ) {
262+ for ( i = 0 ; i < opts . changes . length ; i ++ ) {
249263 changes [ opts . changes [ i ] ] = data [ opts . changes [ i ] ] ;
250264 }
251- for ( i = 0 ; i < opts . keys . length ; i ++ ) {
252- conditions [ opts . keys [ i ] ] = data [ opts . keys [ i ] ] ;
265+ for ( i = 0 ; i < opts . keyProperties . length ; i ++ ) {
266+ prop = opts . keyProperties [ i ] ;
267+ conditions [ prop . mapsTo ] = opts . originalKeyValues [ prop . name ] ;
253268 }
254269 changes = Utilities . transformPropertyNames ( changes , Model . allProperties ) ;
255270
@@ -258,6 +273,7 @@ function Instance(Model, opts) {
258273 return saveError ( cb , err ) ;
259274 }
260275 opts . changes . length = 0 ;
276+ rememberKeys ( ) ;
261277
262278 next ( true ) ;
263279 } ) ;
@@ -464,8 +480,12 @@ function Instance(Model, opts) {
464480 return opts . data [ key ] ;
465481 } ,
466482 set : function ( val ) {
467- if ( Model . allProperties [ key ] . key === true && opts . data [ key ] != null ) {
468- return ;
483+ if ( prop . key === true ) {
484+ if ( prop . type == 'serial' && opts . data [ key ] != null ) {
485+ return ;
486+ } else {
487+ opts . originalKeyValues [ prop . name ] = opts . data [ prop . name ] ;
488+ }
469489 }
470490
471491 if ( ! setInstanceProperty ( key , val ) ) {
@@ -642,12 +662,15 @@ function Instance(Model, opts) {
642662 enumerable : false
643663 } ) ;
644664
645- for ( i = 0 ; i < opts . keys . length ; i ++ ) {
646- if ( ! opts . data . hasOwnProperty ( opts . keys [ i ] ) ) {
665+ for ( i = 0 ; i < opts . keyProperties . length ; i ++ ) {
666+ var prop = opts . keyProperties [ i ] ;
667+
668+ if ( ! ( prop . name in opts . data ) ) {
647669 opts . changes = Object . keys ( opts . data ) ;
648670 break ;
649671 }
650672 }
673+ rememberKeys ( ) ;
651674
652675 opts . setupAssociations ( instance ) ;
653676
0 commit comments