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);
    }
Exemple #3
0
    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);
    }