diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs index 3ba7092395..b1bb2df421 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs @@ -155,7 +155,6 @@ namespace Volo.Abp.EntityFrameworkCore } ChangeTracker.CascadeDeleteTiming = CascadeTiming.OnSaveChanges; - ChangeTracker.DeleteOrphansTiming = CascadeTiming.OnSaveChanges; ChangeTracker.Tracked += ChangeTracker_Tracked; } diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreTestModule.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreTestModule.cs index e19d939cba..240211d74d 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreTestModule.cs +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreTestModule.cs @@ -1,4 +1,4 @@ -using System; +using System; using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; @@ -38,6 +38,11 @@ namespace Volo.Abp.EntityFrameworkCore { opt.DefaultWithDetailsFunc = q => q.Include(p => p.Phones); }); + + options.Entity(opt => + { + opt.DefaultWithDetailsFunc = q => q.Include(p => p.Books); + }); }); var sqliteConnection = CreateDatabaseAndGetConnection(); diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DataFiltering/SoftDelete_Tests.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DataFiltering/SoftDelete_Tests.cs index 7d92ed3a87..1a85cb291f 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DataFiltering/SoftDelete_Tests.cs +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DataFiltering/SoftDelete_Tests.cs @@ -1,9 +1,49 @@ -using Volo.Abp.TestApp.Testing; +using System; +using System.Linq; +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.TestApp; +using Volo.Abp.TestApp.Domain; +using Volo.Abp.TestApp.Testing; +using Volo.Abp.Uow; +using Xunit; namespace Volo.Abp.EntityFrameworkCore.DataFiltering { + /// + /// This is just to test the cascade delete behavior of EF Core's navigation properties. + /// Soft delete is usually only used in the aggregate root entity instead . + /// public class SoftDelete_Tests : SoftDelete_Tests { - + [Fact] + public async Task Navigation_Properties_Cascade_Delete_Test() + { + var authorRepository = GetRequiredService>(); + var authorId = Guid.NewGuid(); + + var author = new Author(authorId, "tom"); + author.Books.Add(new Book(authorId, Guid.NewGuid(), "asp net core")); + author.Books.Add(new Book(authorId, Guid.NewGuid(),"c#")); + await authorRepository.InsertAsync(author); + + await WithUnitOfWorkAsync(async () => + { + var author = await authorRepository.GetAsync(authorId); + author.Books.ShouldNotBeEmpty(); + author.Books.Count.ShouldBe(2); + + author.Books.Clear(); + await authorRepository.UpdateAsync(author); + }); + + using (DataFilter.Disable()) + { + author = await authorRepository.GetAsync(authorId); + author.Books.ShouldNotBeEmpty(); + author.Books.ShouldAllBe(x => x.IsDeleted); + } + } } } diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/TestMigrationsDbContext.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/TestMigrationsDbContext.cs index da66392a18..23137f0f0c 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/TestMigrationsDbContext.cs +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/TestMigrationsDbContext.cs @@ -1,4 +1,4 @@ -using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore.TestApp.SecondContext; using Volo.Abp.EntityFrameworkCore.TestApp.ThirdDbContext; using Volo.Abp.TestApp.Domain; @@ -16,7 +16,9 @@ namespace Volo.Abp.EntityFrameworkCore public DbSet Books { get; set; } public DbSet EntityWithIntPks { get; set; } - + + public DbSet Author { get; set; } + public TestMigrationsDbContext(DbContextOptions options) : base(options) { diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/Domain/Author.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/Domain/Author.cs new file mode 100644 index 0000000000..a1bb46470b --- /dev/null +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/Domain/Author.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using Volo.Abp.Domain.Entities; + +namespace Volo.Abp.TestApp.Domain +{ + public class Author : AggregateRoot + { + public string Name { get; set; } + + public ICollection Books { get; set; } + + private Author() + { + + } + + public Author(Guid id, string name) + : base(id) + { + Name = name; + Books = new List(); + } + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/Domain/Book.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/Domain/Book.cs new file mode 100644 index 0000000000..c8323f79d9 --- /dev/null +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/Domain/Book.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using Volo.Abp.Domain.Entities; + +namespace Volo.Abp.TestApp.Domain +{ + public class Book : Entity, ISoftDelete + { + public Guid AuthorId { get; set; } + + public string Title { get; set; } + + private Book() + { + + } + + public Book(Guid authorId, Guid id, string title) + { + Id = id; + AuthorId = authorId; + Title = title; + } + + public bool IsDeleted { get; set; } + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/EntityFrameworkCore/TestAppDbContext.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/EntityFrameworkCore/TestAppDbContext.cs index 289364411d..da8bbc8a6c 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/EntityFrameworkCore/TestAppDbContext.cs +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/EntityFrameworkCore/TestAppDbContext.cs @@ -17,6 +17,8 @@ namespace Volo.Abp.TestApp.EntityFrameworkCore public DbSet EntityWithIntPks { get; set; } + public DbSet Author { get; set; } + public TestAppDbContext(DbContextOptions options) : base(options) {