SqlSugar
Um framwork ORM leve projetado especificamente para .NET, oferecendo flexibilidade e alto desempenho
Recursos
1. Compatibilidade multi-banco de dados
2. Alto desempenho, com melhoria significativa na operação em lote. Suporta análise customizada de Lambda e construção dinâmica de SQL, além de cache de primeiro e segundo nível (por sessão e global), reduzindo a carga de consultas repetidas
3. Facilidade de uso, com APIs encadeadas baseadas em expressões Lambda para operações totalmente gerenciadas
4. Funcionalidades empresariais, incluindo particionamento de tabelas para grandes volumes de dados, isolamento SaaS, transações distribuídas e controle explícito de transações para garantir consistência dos dados
Cenários de uso
1. Projetos pequenos e médios com desenvolvimento ágil
2. Processamento de grandes volumes de dados
3. Sistemas com múltiplos bancos de dados
4. Plataformas SaaS e sistemas com alta concorrência
5. Migração para bancos de dados nacionais
Comparação entre objetos de operação
Na documentação encontrada, o uso foi feito com o objeto SqlSugarClient, porém no projeto atual é adotado SqlSugarScope. A seguir está a relação entre eles:
| Recurso | SqlSugarClient | SqlSugarScope | |
|---|---|---|---|
| Segurança de threads | Não thread-safe, requer nova instância a cada uso | Thread-safe, gerencia contexto automaticamente via padrão singleton | |
| Desempenho | Mais rápido (sem sobrecarga adicional) | Levemente menor (~5% mais lento) | |
| Cenário de uso | Desenvolvedores experientes, cenários de alta concorrência | Fácil para iniciantes, simplifica gerenciamento de threads | |
| Modo de injeção de dependência | Scoped (singleton por escopo) ou transient | Singleton (global) | |
| Gerenciamento de transações | Necessita controle manual da consistência do contexto | Compartilha transações automaticamente entre contextos | |
| Suporte a multi-locatário | Requer chamada explícita GetConnection | Otimizado com GetConnectionScope |
SqlSugarClient: Ideal para requisições únicas, consultas frequentes (como em Web API) e cenários onde o desempenho máximo é necessário
SqlSugarScope: Adequado para tarefas multithread e serviços de longa duração (como Windows Service)
Neste caso, optou-se por SqlSugarScope, sendo este o foco principal deste estudo
Uso do SqlSugarScope
Inicialização em classe estática global``` public static class SqlSugarHelper { public static SqlSugarScope Db = new SqlSugarScope(new ConnectionConfig { ConnectionString = "DataSource=sqlsugar-dev.db", DbType = DbType.Sqlite, IsAutoCloseConnection = true, // Libera automaticamente a conexão InitKeyType = InitKeyType.Attribute // Identifica chave primária pela anotação do modelo }, db => { // Configurações globais (ex: log de SQL) db.Aop.OnLogExecuting = (sql, pars) => Console.WriteLine(UtilMethods.GetNativeSql(sql, pars)); }); } //////////////// Se adicionado ao código, só será executado em modo debug #if DEBUG #endif
Configuração para múltiplos bancos (não utilizado)```
var configs = new List<ConnectionConfig>
{
new { ConfigId = "DB1", DbType = DbType.SqlServer, ConnectionString = "..." },
new { ConfigId = "DB2", DbType = DbType.MySql, ConnectionString = "..." }
};
var db = new SqlSugarScope(configs, db => { /* configurações */ });
Classe de entidade de banco``` [SugarTable("Users")] public class User { [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] public int Id { get; set; } public string Name { get; set; } }
Registro do SqlSugarScope no contêiner Prism```
public class DBModule : IModule
{
public void OnInitialized(IContainerProvider containerProvider)
{
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
// Registro no contêiner Prism usando IContainerRegistry como singleton
// Garante que a instância seja criada apenas uma vez durante o ciclo de vida da aplicação
// Registra o acessor SqlSugar
containerRegistry.RegisterSingleton<ISqlSugarVisitor, SqlSugarVisitor>(); // Mapeia a interface ISqlSugarVisitor para SqlSugarVisitor como singleton
// ISqlSugarVisitor é uma interface customizada implementada no projeto common para gerenciar SqlSugarScope
}
}
Registro do módulo em App.xaml.cs``` protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog) { moduleCatalog.AddModule<DBModule>(); }
Implementação CRUD```
var user = new User { Name = "Zhang San", Age = 25 }; // Inserção única
db.Insertable(user).ExecuteCommand; // Retorna número de linhas afetadas
var users = new List<User> // Inserção em lote
{
new { Name = "Li Si", Age = 28 },
new { Name = "Wang Wu", Age = 22 }
};
db.Insertable(users).ExecuteCommand;
var userList = db.Queryable<User>.ToList(); // Consultar todos os registros
// Consulta condicional
var result = db.Queryable<User> // Filtrar por idade
.Where(u => u.Age > 20)
.ToList();
// Pesquisa parcial
var fuzzyResult = db.Queryable<User>
.Where(u => u.Name.Contains("Zhang"))
.ToList();
// Paginação
var pageList = db.Queryable<User>
.ToPageList(1, 10); // Página 1, 10 itens por página
// Atualização
var user = db.Queryable<User>.Single(u => u.Id == 1);
user.Age = 30;
db.Updateable(user).ExecuteCommand; // Atualização única
// Atualização condicional
db.Updateable<User>
.SetColumns(u => new User { Age = 25 })
.Where(u => u.Name.StartsWith("Wang"))
.ExecuteCommand;
// Exclusão por chave primária
db.Deleteable<User>.In(1).ExecuteCommand; // Remove registro com Id = 1
// Exclusão condicional
db.Deleteable<User>
.Where(u => u.Age < 18)
.ExecuteCommand;