Framework ORM SqlSugar

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;

Tags: ORM database sqldatabase EntityFramework sqlite

Publicado em 10-14 03:31