I metodi GetAll
e Get
del CrudAppService
già pronto non includono le entità figlio.
È possibile modificare il suo comportamento?
GetAllIncluding
ha qualche problema se l'entità inclusa ha una proprietà di navigazione per il genitore; cade in una sorta di dipendenza circolare. C'è qualche Attribute
o trucco per escludere la proprietà di navigazione dalla serializzazione? L'attributo [NonSerialized]
non sembra applicabile a una proprietà di navigazione.
PostAppService :
public class PostAppService : CrudAppService<Post, PostDto>, IPostAppService
{
IRepository<Post> _repository = null;
public PostAppService(IRepository<Post> repository) : base(repository)
{
_repository = repository;
}
protected override IQueryable<Post> CreateFilteredQuery(PagedAndSortedResultRequestDto input)
{
return _repository.GetAllIncluding(p => p.Items);
}
}
PostDto :
[AutoMap(typeof(Post))]
public class PostDto : EntityDto
{
public ICollection<Item> Items { get; set; }
}
Post entity:
[Table("AbpPosts")]
public class Post : FullAuditedEntity<int,User>
{
public virtual ICollection<Item> Items { get; set; }
}
Entità articolo :
[Table("AbpItems")]
public class Item : Entity
{
[ForeignKey("PostId")]
public Post Post { get; set; }
public int PostId { get; set; }
}
Devi usare il caricamento di eager.
Sostituisci CreateFilteredQuery
e GetEntityById
nel tuo AppService:
public class MyAppService : CrudAppService<ParentEntity, ParentEntityDto>, IMyAppService
{
public MyAppService(IRepository<ParentEntity> repository)
: base(repository)
{
}
protected override IQueryable<ParentEntity> CreateFilteredQuery(PagedAndSortedResultRequestDto input)
{
return Repository.GetAllIncluding(p => p.ChildEntity);
}
protected override ParentEntity GetEntityById(int id)
{
var entity = Repository.GetAllIncluding(p => p.ChildEntity).FirstOrDefault(p => p.Id == id);
if (entity == null)
{
throw new EntityNotFoundException(typeof(ParentEntity), id);
}
return entity;
}
}
Il vantaggio di sovrascrivere questi metodi è che si continua a ottenere gratuitamente il controllo , il conteggio , l' ordinamento , il paging e la mappatura delle autorizzazioni .
GetAllIncluding
ha qualche problema se l'entità inclusa ha una proprietà di navigazione per il genitore; cade in una sorta di dipendenza circolare. C'è qualcheAttribute
o trucco per escludere la proprietà di navigazione dalla serializzazione?
Restituisci ItemDto
(senza proprietà di navigazione) in PostDto
.
Sì, devi includere esplicitamente come questo.
GetAll().Include(i => i.ChildEntities)