/// <summary> /// Save the entities. /// </summary> /// <param name="newEntities">Mapping of readers to their entities.</param> private void SaveEntities(IReadOnlyCollection <ReaderEntityPair> newEntities) { var pairsToSave = newEntities .Where(pair => !Reporter.HasErrors(pair.ObjectReader) && pair.Entity != null); if (_testRun) { int count = pairsToSave.Count( ); Reporter.ReportOk(count); Reporter.Flush( ); return; } try { var entities = pairsToSave.Select(pair => pair.Entity); _entitySaver.SaveEntities(entities); int count = entities.Count( ); Reporter.ReportOk(count); } catch { foreach (var pair in pairsToSave) { IObjectReader reader = pair.ObjectReader; if (Reporter.HasErrors(reader)) { continue; } try { // Re-create entity, because it seems that a duplicate key violation in the batch save munches up the entity in the pair. IEntity entity = ReaderToEntityAdapter.CreateEntity(reader, Reporter); entity.Save( ); Reporter.ReportOk( ); } catch (Exception ex) { Reporter.ReportError(pair.ObjectReader, ex.Message); } } } finally { Reporter.Flush( ); } }
public void Test_CreateEntity(bool createEntities) { Mock <IObjectReader> mockReader; IObjectReader reader; Mock <IEntity> mockEntity; IEntity entity; ReaderToEntityAdapter adapter; List <MemberProcessor> memberProcessors; IImportReporter reporter = new Mock <IImportReporter>( ).Object; // Setup reader mockReader = new Mock <IObjectReader>(MockBehavior.Strict); mockReader.Setup(x => x.GetString("member1")).Returns("value1").Verifiable("member1 not called"); mockReader.Setup(x => x.GetString("member2")).Returns("value2").Verifiable("member2 not called"); reader = mockReader.Object; // Setup entity mockEntity = new Mock <IEntity>(MockBehavior.Strict); mockEntity.Setup(x => x.SetField(1, "value1")).Verifiable("field1 not set"); mockEntity.Setup(x => x.SetField(2, "value2")).Verifiable("field2 not set"); entity = mockEntity.Object; // Set up adapter int called = 0; memberProcessors = new List <MemberProcessor>( ); memberProcessors.Add(new MemberProcessor((r, e, rpt) => { string value = r.GetString("member1"); e.SetField(1, value); called++; })); memberProcessors.Add(new MemberProcessor((r, e, rpt) => { string value = r.GetString("member2"); e.SetField(2, value); called++; })); Func <IEntity> instanceFactory = () => mockEntity.Object; adapter = new ReaderToEntityAdapter(memberProcessors, instanceFactory, null); // Go! IEntity result; if (createEntities) { result = adapter.CreateEntities(reader.ToEnumerable( ), reporter).First( ).Entity; } else { result = adapter.CreateEntity(reader, ConnectorRequestExceptionReporter.Instance); } Assert.That(result, Is.SameAs(mockEntity.Object)); // Verify everything called mockReader.VerifyAll( ); mockEntity.VerifyAll( ); Assert.That(called, Is.EqualTo(2), "Processor should be called twice."); // Entity.Save should not be called, which gets verified here because of Strict mode. }