Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 9.3 数据访问最佳实践

9.3 数据访问最佳实践

1. 连接管理

1.1 使用连接池

// 推荐:依赖.NET内置连接池机制
using (var connection = new SqlConnection(connectionString))
{
    // 操作代码
}

1.2 连接字符串安全

  • 使用ConfigurationManager或环境变量存储
  • 避免硬编码
  • 考虑使用Azure Key Vault等安全存储方案

2. 命令执行

2.1 参数化查询

// 防止SQL注入的正确做法
var cmd = new SqlCommand(
    "SELECT * FROM Users WHERE Username = @username", 
    connection);
cmd.Parameters.AddWithValue("@username", inputUsername);

2.2 存储过程使用

var cmd = new SqlCommand("sp_GetUserDetails", connection) 
{
    CommandType = CommandType.StoredProcedure
};
cmd.Parameters.AddWithValue("@UserId", userId);

3. 事务处理

3.1 显式事务

using (var transaction = connection.BeginTransaction())
{
    try {
        // 多个操作
        transaction.Commit();
    }
    catch {
        transaction.Rollback();
        throw;
    }
}

3.2 隔离级别选择

// 根据业务需求选择合适的隔离级别
connection.BeginTransaction(IsolationLevel.ReadCommitted);

4. ORM最佳实践

4.1 Entity Framework Core优化

// 避免N+1查询问题
var blogs = context.Blogs
    .Include(b => b.Posts)
    .ToList();

4.2 批量操作

// 使用EF Core的批量扩展
context.BulkInsert(entities);

5. 性能考量

5.1 分页实现

// 使用Skip/Take实现服务器端分页
var pagedData = context.Products
    .OrderBy(p => p.Id)
    .Skip((pageNumber - 1) * pageSize)
    .Take(pageSize)
    .ToList();

5.2 缓存策略

  • 考虑使用MemoryCache或分布式缓存
  • 实现缓存失效机制
  • 对频繁读取的静态数据使用缓存

6. 安全实践

6.1 最小权限原则

  • 为应用配置仅需的数据库权限
  • 避免使用sa账户

6.2 敏感数据处理

// 使用加密列
[ProtectedPersonalData]
public string SocialSecurityNumber { get; set; }

7. 监控与日志

7.1 查询监控

  • 启用EF Core的查询日志
  • 使用SQL Server Profiler或扩展事件

7.2 慢查询分析

// 配置EF Core警告阈值
optionsBuilder.UseSqlServer(connectionString)
    .ConfigureWarnings(warnings => warnings
        .Log(RelationalEventId.QueryClientEvaluationWarning)
        .Log(RelationalEventId.QueryPossibleUnintendedUseOfEqualsWarning));

8. 现代架构模式

8.1 仓储模式实现

public interface IRepository<T> where T : class
{
    Task<T> GetByIdAsync(int id);
    Task<IEnumerable<T>> GetAllAsync();
    Task AddAsync(T entity);
    // 其他基本操作
}

8.2 CQRS模式应用

// 命令和查询分离
public class CreateProductCommand : IRequest<int>
{
    public string Name { get; set; }
    public decimal Price { get; set; }
}

public class GetProductsQuery : IRequest<List<ProductDto>>
{
    public bool OnlyActive { get; set; }
}

9. 单元测试策略

9.1 测试数据库访问

// 使用内存数据库测试
var options = new DbContextOptionsBuilder<AppDbContext>()
    .UseInMemoryDatabase(databaseName: "TestDb")
    .Options;

9.2 模拟数据库

// 使用Moq等框架模拟DbContext
var mockSet = new Mock<DbSet<Product>>();
var mockContext = new Mock<AppDbContext>();
mockContext.Setup(m => m.Products).Returns(mockSet.Object);

10. 云原生数据访问

10.1 弹性连接处理

// 实现重试策略
var strategy = context.Database.CreateExecutionStrategy();
strategy.Execute(() => 
{
    using (var transaction = context.Database.BeginTransaction())
    {
        // 业务操作
        transaction.Commit();
    }
});

10.2 多数据库支持

// 根据环境配置不同数据库提供程序
services.AddDbContext<AppDbContext>(options =>
    Configuration.GetValue<bool>("UsePostgres") 
        ? options.UseNpgsql(connectionString)
        : options.UseSqlServer(connectionString)
);
Last Updated:: 5/3/25, 11:34 PM