ISul.Data.Core
2026.10.1.4
dotnet add package ISul.Data.Core --version 2026.10.1.4
NuGet\Install-Package ISul.Data.Core -Version 2026.10.1.4
<PackageReference Include="ISul.Data.Core" Version="2026.10.1.4" />
<PackageVersion Include="ISul.Data.Core" Version="2026.10.1.4" />
<PackageReference Include="ISul.Data.Core" />
paket add ISul.Data.Core --version 2026.10.1.4
#r "nuget: ISul.Data.Core, 2026.10.1.4"
#:package ISul.Data.Core@2026.10.1.4
#addin nuget:?package=ISul.Data.Core&version=2026.10.1.4
#tool nuget:?package=ISul.Data.Core&version=2026.10.1.4
ISul Data Package
Ordenação de consultas
Os métodos OrderBy continuam aceitando campos, caminhos aninhados e direção por campo:
var query = db.Conteudo.OrderBy("Ordem, Titulo", orderBy);
var events = db.EmpresaEvento.OrderBy("Evento.Edicao desc, Ordem asc");
Use os nomes reais das propriedades, sem distinção entre maiúsculas e minúsculas.
Direções diferentes de asc e desc, assim como campos vazios entre vírgulas, são rejeitadas.
Movimentação de registros
Para entidades que implementam ISortable<TId>, ChangeOrderAsync move a origem para
a ordem do destino e desloca os registros intermediários em uma unidade:
int affected = await db.EmpresaEvento.ChangeOrderAsync(
originId,
targetId,
scope: x => x.CategoriaId == categoriaId,
cancellationToken: cancellationToken);
Ao mover de 2 para 5, as posições 3, 4 e 5 são decrementadas. Ao mover de 5 para 2,
as posições 2, 3 e 4 são incrementadas. O filtro scope limita tanto a busca da origem
e do destino quanto a atualização. Inclua nele todas as dimensões do agrupamento
(por exemplo, evento e categoria). Sem filtro, o escopo é todo o conjunto visível.
- Requer EF Core com provedor relacional e suporte a
ExecuteUpdateAsync. - O intervalo afetado deve ter ordens distintas e consecutivas; inconsistências
lançam
InvalidOperationExceptionantes da atualização. Não renumera a lista inteira. - Origem ou destino ausente no escopo lança
KeyNotFoundException. - Origem e destino iguais retornam zero, desde que o registro exista no escopo.
- Persiste diretamente no banco em uma única atualização. Não requer
SaveChangesAsynce não salva outras alterações pendentes. Entidades rastreadas não são sincronizadas; recarregue-as antes de reutilizar sua ordem. - Cria uma transação com isolamento
Serializable, usando a estratégia de execução do contexto. Se já existe uma transação, participa dela sem confirmar ou revertê-la; o chamador deve garantir isolamento adequado e tratar conflitos de concorrência. - Uma restrição única de ordem verificada imediatamente pelo banco pode impedir o deslocamento por colisões intermediárias. O método não contorna essa restrição; quando aplicável, use uma restrição diferível suportada pelo provedor.
MoveUpAsync,MoveDownAsynceMoveUpOrDownAsyncmantêm o comportamento anterior: trocam a ordem de duas entidades e dependem do salvamento pelo chamador.
Slugs
Para entidades que implementam ISlugable<TId>, a geração usa ISul.Util.TextUtil
e resolve colisões com sufixos numéricos (pagina, pagina-2, pagina-3):
// Edição ou inclusão com ID já atribuído: ignora o próprio registro.
item.Slug = await db.Conteudo.GenerateUniqueSlugAsync(
request.Titulo, item.Id, cancellationToken);
// Unicidade dentro de um site.
item.Slug = await db.Conteudo
.Where(x => x.SiteId == item.SiteId)
.GenerateUniqueSlugAsync(request.Titulo, item.Id, cancellationToken);
// Inclusão sem ID atribuído: não exclui nenhum registro da verificação.
item.Slug = await db.Conteudo.GenerateUniqueSlugAsync<Conteudo, Guid>(
request.Titulo, cancellationToken);
A função retorna a string sem modificar ou salvar entidades. Remove hífens das
extremidades da base e rejeita textos que produzam slug vazio. Os filtros da consulta
são respeitados. CreateAndCheckSlug(value, id) continua disponível e usa o novo algoritmo.
A verificação consulta apenas registros persistidos, não reserva o slug e não considera inclusões pendentes no contexto. Configure um índice único no banco com o mesmo escopo para garantir unicidade em gravações concorrentes; o chamador trata uma eventual colisão na gravação. Se registros ocultados por filtros globais também reservam slugs, inclua-os na consulta de disponibilidade. Considere o tamanho máximo da coluna ao fornecer o texto.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- ISul.Standard (>= 2026.10.1.4)
- Microsoft.EntityFrameworkCore (>= 10.0.12)
- Microsoft.EntityFrameworkCore.Relational (>= 10.0.12)
- Microsoft.Extensions.DependencyInjection (>= 10.0.12)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.12)
- Microsoft.Extensions.Options (>= 10.0.12)
-
net8.0
- ISul.Standard (>= 2026.10.1.4)
- Microsoft.EntityFrameworkCore (>= 8.0.29)
- Microsoft.EntityFrameworkCore.Relational (>= 8.0.29)
- Microsoft.Extensions.DependencyInjection (>= 10.0.12)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.12)
- Microsoft.Extensions.Options (>= 10.0.12)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|