includeDetails 在 ABP 框架中不起作用

Ade*_*gun 0 c# entity-framework-core abp

我有一个简单的项目(ABP 版本:3.1.2,数据库:EF Core)。

我跑GetAsync

var author = await _authorRepository.GetAsync(id, includeDetails: true);
Run Code Online (Sandbox Code Playgroud)

author.Films没有包括在内。我可能忘记了什么?

Author( AggregateRoot):

public class Author : FullAuditedAggregateRoot<Guid>
{
    public string Name { get; private set; }
    public DateTime BirthDate { get; set; }
    public string ShortBio { get; set; }
    public List<Film> Films { get; set; }
    private Author()
    {
        Films = new List<Film>();
        /* This constructor is for deserialization / ORM purpose */
    }
    internal Author(
        Guid id,
        [NotNull] string name,
        DateTime birthDate,
        [CanBeNull] string shortBio = null)
        : base(id)
    {
        Name = name;
        BirthDate = birthDate;
        ShortBio = shortBio;
        Films = new List<Film>();
    }
}
Run Code Online (Sandbox Code Playgroud)

Film( Entity):

public class Film : Entity<Guid>
{
    public virtual Guid AuthorId { get; internal set; }
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

SeedAsyncDataSeeder课堂上(我在DbMigrator运行后检查了数据库中是否存在数据,如预期的那样在表中有这些数据):

public async Task SeedAsync(DataSeedContext context)
{
    if (await _authorRepository.GetCountAsync() == 0)
    {
        var authorId = _guidGenerator.Create();
        await _authorRepository.InsertAsync(
            new Author(authorId, "J. R. R. Tolkien", DateTime.Now.AddYears(-60), "bio1"),
            autoSave: true
        );
        await _filmRepository.InsertAsync(
            new Film { AuthorId = authorId, Name = "The Return of the King1" },
            autoSave: true);
        await _filmRepository.InsertAsync(
            new Film { AuthorId = authorId, Name = "The Return of the King2" },
            autoSave: true);
        await _filmRepository.InsertAsync(
            new Film { AuthorId = authorId, Name = "The Return of the King3" },
            autoSave: true);
    }
}
Run Code Online (Sandbox Code Playgroud)

AuthorAppService

public class AuthorAppService : BookStoreAppService, IAuthorAppService
{
    private readonly IAuthorRepository _authorRepository;
    private readonly AuthorManager _authorManager;
    public AuthorAppService(
        IAuthorRepository authorRepository,
        AuthorManager authorManager)
    {
        _authorRepository = authorRepository;
        _authorManager = authorManager;
    }

    public async Task<AuthorDto> GetAsync(Guid id)
    {
        var author = await _authorRepository.GetAsync(id, includeDetails: true);
        return ObjectMapper.Map<Author, AuthorDto>(author);
    }
}
Run Code Online (Sandbox Code Playgroud)

aar*_*ron 5

来自https://docs.abp.io/en/abp/latest/Best-Practices/Entity-Framework-Core-Integration

  • 不要创建一个IncludeDetails 扩展方法IQueryable<TEntity>对于具有每个聚合根子集

  • ...

  • 替代WithDetails仓库里面聚集根具有的方法子集

public static class AuthorEfCoreQueryableExtensions
{
    public static IQueryable<Author> IncludeDetails(this IQueryable<Author> queryable, bool include = true)
    {
        if (!include)
        {
            return queryable;
        }

        return queryable
            .Include(x => x.Films);
    }
}

Run Code Online (Sandbox Code Playgroud)
public class AuthorRepository : EfCoreRepository<IMyDbContext, Author, Guid>, IAuthorRepository
{
    ...

    public override IQueryable<Author> WithDetails()
    {
        return GetQueryable().IncludeDetails(); // Uses the extension method defined above
    }
}
Run Code Online (Sandbox Code Playgroud)