public void Batch_command_throws_on_commands_with_circular_dependencies_including_indexes(bool sensitiveLogging) { var model = CreateCyclicFKModel(); var configuration = CreateContextServices(model); var stateManager = configuration.GetRequiredService <IStateManager>(); var fakeEntry = stateManager.GetOrCreateEntry( new FakeEntity { Id = 42, UniqueValue = "Test" }); fakeEntry.SetEntityState(EntityState.Added); var relatedFakeEntry = stateManager.GetOrCreateEntry( new RelatedFakeEntity { Id = 1, RelatedId = 42 }); relatedFakeEntry.SetEntityState(EntityState.Added); var fakeEntry2 = stateManager.GetOrCreateEntry( new FakeEntity { Id = 2, RelatedId = 1, UniqueValue = "Test2" }); fakeEntry2.SetEntityState(EntityState.Modified); fakeEntry2.SetOriginalValue(fakeEntry2.EntityType.FindProperty(nameof(FakeEntity.UniqueValue)), "Test"); var modelData = new UpdateAdapter(stateManager); var expectedCycle = sensitiveLogging ? @"FakeEntity { 'Id': 42 } [Added] <- ForeignKey { 'RelatedId': 42 } RelatedFakeEntity { 'Id': 1 } [Added] <- ForeignKey { 'RelatedId': 1 } FakeEntity { 'Id': 2 } [Modified] <- Index { 'UniqueValue': Test } FakeEntity { 'Id': 42 } [Added]" : @"FakeEntity [Added] <- ForeignKey { 'RelatedId' } RelatedFakeEntity [Added] <- ForeignKey { 'RelatedId' } FakeEntity [Modified] <- Index { 'UniqueValue' } FakeEntity [Added]" + CoreStrings.SensitiveDataDisabled; Assert.Equal( CoreStrings.CircularDependency(ListLoggerFactory.NormalizeLineEndings(expectedCycle)), Assert.Throws <InvalidOperationException>( () => CreateCommandBatchPreparer(updateAdapter: modelData, sensitiveLogging: sensitiveLogging) .BatchCommands(new[] { fakeEntry, relatedFakeEntry, fakeEntry2 }, modelData).ToArray()).Message); }
public void Batch_command_throws_on_delete_commands_with_circular_dependencies(bool sensitiveLogging) { var model = CreateCyclicFkWithTailModel(); var configuration = CreateContextServices(model); var stateManager = configuration.GetRequiredService <IStateManager>(); var fakeEntry = stateManager.GetOrCreateEntry( new FakeEntity { Id = 1, RelatedId = 2 }); fakeEntry.SetEntityState(EntityState.Deleted); var relatedFakeEntry = stateManager.GetOrCreateEntry( new RelatedFakeEntity { Id = 2, RelatedId = 1 }); relatedFakeEntry.SetEntityState(EntityState.Deleted); var anotherFakeEntry = stateManager.GetOrCreateEntry( new AnotherFakeEntity { Id = 3, AnotherId = 2 }); anotherFakeEntry.SetEntityState(EntityState.Deleted); var modelData = new UpdateAdapter(stateManager); var expectedCycle = sensitiveLogging ? @"FakeEntity { 'Id': 1 } [Deleted] ForeignKey { 'RelatedId': 2 } <- RelatedFakeEntity { 'Id': 2 } [Deleted] ForeignKey { 'RelatedId': 1 } <- FakeEntity { 'Id': 1 } [Deleted]" : @"FakeEntity [Deleted] ForeignKey { 'RelatedId' } <- RelatedFakeEntity [Deleted] ForeignKey { 'RelatedId' } <- FakeEntity [Deleted]" + CoreStrings.SensitiveDataDisabled; Assert.Equal( CoreStrings.CircularDependency(ListLoggerFactory.NormalizeLineEndings(expectedCycle)), Assert.Throws <InvalidOperationException>( () => CreateCommandBatchPreparer(updateAdapter: modelData, sensitiveLogging: sensitiveLogging).BatchCommands( // Order is important for this test. Entry which is not part of cycle but tail should come first. new[] { anotherFakeEntry, fakeEntry, relatedFakeEntry }, modelData).ToArray()).Message); }
public void Batch_command_throws_on_commands_with_circular_dependencies(bool sensitiveLogging) { var model = CreateCyclicFKModel(); var configuration = CreateContextServices(model); var stateManager = configuration.GetRequiredService <IStateManager>(); var fakeEntry = stateManager.GetOrCreateEntry( new FakeEntity { Id = 42, RelatedId = 1 }); fakeEntry.SetEntityState(EntityState.Added); var relatedFakeEntry = stateManager.GetOrCreateEntry( new RelatedFakeEntity { Id = 1, RelatedId = 42 }); relatedFakeEntry.SetEntityState(EntityState.Added); var modelData = new UpdateAdapter(stateManager); var expectedCycle = sensitiveLogging ? @"FakeEntity { 'Id': 42 } [Added] <- ForeignKey { 'RelatedId': 42 } RelatedFakeEntity { 'Id': 1 } [Added] <- ForeignKey { 'RelatedId': 1 } FakeEntity { 'Id': 42 } [Added]" : @"FakeEntity [Added] <- ForeignKey { 'RelatedId' } RelatedFakeEntity [Added] <- ForeignKey { 'RelatedId' } FakeEntity [Added]" + CoreStrings.SensitiveDataDisabled; Assert.Equal( CoreStrings.CircularDependency(ListLoggerFactory.NormalizeLineEndings(expectedCycle)), Assert.Throws <InvalidOperationException>( () => CreateBatches(new[] { fakeEntry, relatedFakeEntry }, modelData, sensitiveLogging)).Message); }