@@ -328,18 +328,29 @@ async Task AddOrUpdateNavigateAsync(TEntity item, bool isAdd, string propertyNam
328328 }
329329 break ;
330330 case Internal . Model . TableRefType . OneToMany :
331- var addlist = isAdd ? new List < object > ( ) : null ;
331+ var addList = new List < object > ( ) ;
332+ var addOrUpdateList = new List < object > ( ) ;
332333 foreach ( var propValItem in propValEach )
333334 {
334335 for ( var colidx = 0 ; colidx < tref . Columns . Count ; colidx ++ )
335336 {
336337 var val = FreeSql . Internal . Utils . GetDataReaderValue ( tref . RefColumns [ colidx ] . CsType , _db . OrmOriginal . GetEntityValueWithPropertyName ( _table . Type , item , tref . Columns [ colidx ] . CsName ) ) ;
337338 _db . OrmOriginal . SetEntityValueWithPropertyName ( tref . RefEntityType , propValItem , tref . RefColumns [ colidx ] . CsName , val ) ;
338339 }
339- if ( isAdd ) addlist . Add ( propValItem ) ;
340- else await refSet . AddOrUpdateAsync ( propValItem , cancellationToken ) ;
340+ if ( isAdd ) addList . Add ( propValItem ) ;
341+ else
342+ {
343+ var flagExists = refSet . ExistsInStates ( propValItem ) ;
344+ if ( flagExists == null ) addList . Add ( propValItem ) ; //自增/Guid
345+ else addOrUpdateList . Add ( propValItem ) ; //统一状态管理
346+ }
347+ }
348+ if ( addList . Any ( ) ) await refSet . AddRangeAsync ( addList , cancellationToken ) ;
349+ if ( addOrUpdateList . Any ( ) )
350+ {
351+ var existsList = await refSet . Select . WhereDynamic ( addOrUpdateList ) . ToListAsync ( false , cancellationToken ) ;
352+ foreach ( var aouItem in addOrUpdateList ) await refSet . AddOrUpdateAsync ( aouItem , cancellationToken ) ;
341353 }
342- if ( isAdd ) await refSet . AddRangeAsync ( addlist , cancellationToken ) ;
343354 break ;
344355 }
345356 } ;
0 commit comments