f Mysql-.NET Core 数据库ORM框架用法简述 - Powered by qidao123.com技术社区

.NET Core 数据库ORM框架用法简述

打印 上一主题 下一主题

主题 1755|帖子 1755|积分 5275

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
.NET Core ORM框架用法简述

一、主流.NET Core ORM框架概述

在.NET Core生态系统中,主流的ORM(Object-Relational Mapping)框架包括:

  • ​Entity Framework Core (EF Core)​​ - 微软官方推出的ORM框架
  • ​Dapper​​ - 轻量级微ORM
  • ​Npgsql.EntityFrameworkCore.PostgreSQL​​ - PostgreSQL专用EF Core提供程序
  • ​Pomelo.EntityFrameworkCore.MySql​​ - MySQL专用EF Core提供程序
  • ​LINQ to DB​​ - 高性能ORM
本文重点先容最常用的EF Core和Dapper。
二、Entity Framework Core (EF Core) 使用指南

1. 安装与配置

​安装NuGet包​​:
  1. [/code] [code]dotnet add package Microsoft.EntityFrameworkCore
  2. dotnet add package Microsoft.EntityFrameworkCore.SqlServer # SQL Server提供程序
  3. # 或其他数据库提供程序
复制代码
​DbContext配置​​:
  1. [/code] [code]public class AppDbContext : DbContext
  2. {
  3.     public DbSet<User> Users { get; set; }
  4.     public DbSet<Order> Orders { get; set; }
  5.    
  6.     protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  7.     {
  8.         optionsBuilder.UseSqlServer("Server=.;Database=MyApp;Trusted_Connection=True;");
  9.     }
  10. }
复制代码
​依赖注入配置​​(保举):
  1. [/code] [code]// Startup.cs或Program.cs
  2. builder.Services.AddDbContext<AppDbContext>(options =>
  3.     options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
复制代码
2. 数据模子界说

​实体类​​:
  1. [/code] [code]public class User
  2. {
  3.     public int Id { get; set; }
  4.     public string Name { get; set; }
  5.     public DateTime BirthDate { get; set; }
  6.    
  7.     // 导航属性
  8.     public ICollection<Order> Orders { get; set; }
  9. }
  10. public class Order
  11. {
  12.     public int Id { get; set; }
  13.     public decimal Amount { get; set; }
  14.     public DateTime OrderDate { get; set; }
  15.    
  16.     // 外键和导航属性
  17.     public int UserId { get; set; }
  18.     public User User { get; set; }
  19. }
复制代码
​Fluent API配置​​:
  1. [/code] [code]protected override void OnModelCreating(ModelBuilder modelBuilder)
  2. {
  3.     modelBuilder.Entity<User>()
  4.         .Property(u => u.Name)
  5.         .IsRequired()
  6.         .HasMaxLength(50);
  7.         
  8.     modelBuilder.Entity<Order>()
  9.         .HasOne(o => o.User)
  10.         .WithMany(u => u.Orders)
  11.         .HasForeignKey(o => o.UserId);
  12. }
复制代码
3. CRUD操纵

​添加数据​​:
  1. [/code] [code]using (var context = new AppDbContext())
  2. {
  3.     var user = new User { Name = "张三", BirthDate = new DateTime(1990, 1, 1) };
  4.     context.Users.Add(user);
  5.     context.SaveChanges();
  6. }
复制代码
​查询数据​​:
  1. [/code] [code]// 简单查询
  2. var users = context.Users.ToList();
  3. // 条件查询
  4. var activeUsers = context.Users
  5.     .Where(u => u.Name.Contains("张"))
  6.     .OrderBy(u => u.BirthDate)
  7.     .ToList();
  8. // 投影查询
  9. var userNames = context.Users
  10.     .Select(u => new { u.Id, u.Name })
  11.     .ToList();
复制代码
​更新数据​​:
  1. [/code] [code]using (var context = new AppDbContext())
  2. {
  3.     var user = context.Users.Find(1);
  4.     if (user != null)
  5.     {
  6.         user.Name = "李四";
  7.         context.SaveChanges();
  8.     }
  9. }
复制代码
​删除数据​​:
  1. [/code] [code]using (var context = new AppDbContext())
  2. {
  3.     var user = context.Users.Find(1);
  4.     if (user != null)
  5.     {
  6.         context.Users.Remove(user);
  7.         context.SaveChanges();
  8.     }
  9. }
复制代码
4. 高级功能

​异步操纵​​:
  1. [/code] [code]var user = await context.Users.FindAsync(1);
  2. var users = await context.Users.Where(u => u.Name.Contains("张")).ToListAsync();
复制代码
​事件处理​​:
  1. [/code] [code]using (var transaction = await context.Database.BeginTransactionAsync())
  2. {
  3.     try
  4.     {
  5.         // 执行多个操作
  6.         await context.SaveChangesAsync();
  7.         await transaction.CommitAsync();
  8.     }
  9.     catch
  10.     {
  11.         await transaction.RollbackAsync();
  12.         throw;
  13.     }
  14. }
复制代码
​迁移管理​​:
  1. [/code] [code]# 添加迁移
  2. dotnet ef migrations add InitialCreate
  3. # 更新数据库
  4. dotnet ef database update
  5. # 回滚迁移
  6. dotnet ef database update PreviousMigration
复制代码
三、Dapper使用指南

1. 安装与配置

​安装NuGet包​​:
  1. [/code] [code]dotnet add package Dapper
  2. dotnet add package System.Data.SqlClient # SQL Server提供程序
复制代码
​基本使用​​:
  1. [/code] [code]using var connection = new SqlConnection("Server=.;Database=MyApp;Trusted_Connection=True;");
  2. connection.Open();
复制代码
2. CRUD操纵

​查询数据​​:
  1. [/code] [code]var users = connection.Query<User>("SELECT * FROM Users WHERE Name LIKE @Name",
  2.     new { Name = "%张%" });
  3. var user = connection.QueryFirstOrDefault<User>("SELECT * FROM Users WHERE Id = @Id",
  4.     new { Id = 1 });
复制代码
​插入数据​​:
  1. [/code] [code]var id = connection.QuerySingle<int>(
  2.     "INSERT INTO Users (Name, BirthDate) VALUES (@Name, @BirthDate); SELECT SCOPE_IDENTITY();",
  3.     new { Name = "张三", BirthDate = DateTime.Now });
复制代码
​更新数据​​:
  1. [/code] [code]var affectedRows = connection.Execute(
  2.     "UPDATE Users SET Name = @Name WHERE Id = @Id",
  3.     new { Name = "李四", Id = 1 });
复制代码
​删除数据​​:
  1. [/code] [code]var deletedRows = connection.Execute("DELETE FROM Users WHERE Id = @Id", new { Id = 1 });
复制代码
3. 高级功能

​存储过程调用​​:
  1. [/code] [code]var users = connection.Query<User>("dbo.GetUsersByAgeRange",
  2.     new { MinAge = 18, MaxAge = 30 },
  3.     commandType: CommandType.StoredProcedure);
复制代码
​多结果集处理​​:
  1. [/code] [code]using (var multi = connection.QueryMultiple(
  2.     "SELECT * FROM Users; SELECT * FROM Orders",
  3.     commandType: CommandType.Text))
  4. {
  5.     var users = multi.Read<User>().ToList();
  6.     var orders = multi.Read<Order>().ToList();
  7. }
复制代码
​动态参数​​:
  1. [/code] [code]var sql = "SELECT * FROM Users WHERE 1=1";
  2. var parameters = new DynamicParameters();
  3. if (!string.IsNullOrEmpty(name))
  4. {
  5.     sql += " AND Name = @Name";
  6.     parameters.Add("Name", name);
  7. }
  8. if (minAge.HasValue)
  9. {
  10.     sql += " AND Age >= @MinAge";
  11.     parameters.Add("MinAge", minAge.Value);
  12. }
  13. var users = connection.Query<User>(sql, parameters);
复制代码
四、EF Core与Dapper对比

特性EF CoreDapper​​性能​​中等(有ORM开销)高(靠近原生SQL)​​学习曲线​​较陡峭(需明确LINQ、EF概念)平缓(SQL知识即可)​​功能丰富度​​高(迁移、跟踪、变动检测等)低(仅数据访问)​​适用场景​​复杂业务、快速开发高性能需求、复杂SQL​​异步支持​​原生支持需手动实现​​事件管理​​内置支持需手动实现​​缓存​​一级缓存无内置缓存 五、选择建议


  • ​选择EF Core当​​:

    • 必要快速开发CRUD应用
    • 团队熟悉ORM概念
    • 必要数据库迁移功能
    • 项目必要频仍变动数据模子

  • ​选择Dapper当​​:

    • 必要极致性能
    • 实行复杂SQL查询
    • 已有成熟的SQL知识
    • 项目以读为主,写操纵较少

六、最佳实践

EF Core最佳实践


  • ​合理使用耽误加载​​:
    1. [/code] [code]// 禁用延迟加载(推荐)
    2. protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    3. {
    4.     optionsBuilder.UseLazyLoadingProxies(false);
    5. }
    复制代码
  • ​批量操纵优化​​:
    1. // 使用AddRange代替多个Add
    2. context.Users.AddRange(usersList);
    3. // 对于大量数据,考虑分批处理
    4. foreach (var batch in usersList.Batch(500))
    5. {
    6.     context.Users.AddRange(batch);
    7.     context.SaveChanges();
    8. }
    复制代码
  • ​克制N+1查询​​:
    1. // 不好的做法(会导致N+1)
    2. var users = context.Users.ToList();
    3. foreach (var user in users)
    4. {
    5.     var orders = context.Orders.Where(o => o.UserId == user.Id).ToList();
    6. }
    7. // 好的做法(预加载)
    8. var users = context.Users.Include(u => u.Orders).ToList();
    复制代码
Dapper最佳实践


  • ​使用参数化查询​​:
    1. [/code] [code]// 安全的方式
    2. connection.Query<User>("SELECT * FROM Users WHERE Name = @Name", new { Name = userInput });
    3. // 避免拼接SQL字符串(有SQL注入风险)
    4. // connection.Query<User>($"SELECT * FROM Users WHERE Name = '{userInput}'");
    复制代码
  • ​连接受理​​:
    1. [/code] [code]// 使用using确保连接释放
    2. using (var connection = new SqlConnection(connectionString))
    3. {
    4.     connection.Open();
    5.     // 执行操作
    6. }
    复制代码
  • ​存储过程调用​​:
    1. [/code] [code]var result = connection.QueryFirstOrDefault<int>(
    2.     "dbo.GetUserCountByRole",
    3.     new { RoleId = roleId },
    4.     commandType: CommandType.StoredProcedure);
    复制代码
七、性能优化技巧

EF Core性能优化


  • ​启用查询缓存​​:
    1. services.AddDbContext<AppDbContext>(options =>
    2.     options.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking)
    3.            .UseSqlServer(connectionString));
    复制代码
  • ​使用AsNoTracking​​:
    1. // 只读场景使用
    2. var users = context.Users.AsNoTracking().ToList();
    复制代码
  • ​投影查询​​:
    1. // 只查询需要的字段
    2. var userDtos = context.Users
    3.     .Select(u => new UserDto { Id = u.Id, Name = u.Name })
    4.     .ToList();
    复制代码
Dapper性能优化


  • ​使用ExecuteScalar代替QueryFirstOrDefault​​:
    1. // 获取单个值
    2. var count = connection.ExecuteScalar<int>("SELECT COUNT(*) FROM Users");
    复制代码
  • ​使用动态范例​​:
    1. // 当不需要强类型时
    2. var result = connection.Query("SELECT * FROM Users").FirstOrDefault();
    复制代码
  • ​连接池配置​​:
    1. // 在连接字符串中配置
    2. "Server=.;Database=MyApp;User Id=user;Password=pass;Max Pool Size=100;"
    复制代码
八、常见问题解决

EF Core常见问题


  • ​N+1查询问题​​:

    • 使用Include或ThenInclude预加载
    • 使用Select投影查询

  • ​性能降落​​:

    • 检查天生的SQL(使用日志日志)
    • 思量禁用变动跟踪(AsNoTracking)
    • 优化数据库索引

  • ​迁移辩论​​:

    • 使用dotnet ef migrations remove回滚
    • 手动合并迁移文件

Dapper常见问题


  • ​SQL注入风险​​:

    • 始终使用参数化查询
    • 克制字符串拼接SQL

  • ​连接泄漏​​:

    • 确保使用using语句
    • 实现IDisposable模式管理连接

  • ​结果映射错误​​:

    • 检查列名与属性名匹配
    • 使用Query<T>时确保T有默认构造函数

九、工具与扩展

EF Core工具


  • ​EF Core Power Tools​​:

    • 可视化查看数据库模子
    • 快速天生实体类
    • 实行数据库比较

  • ​Entity Framework Core Profiler​​:

    • 分析EF Core天生的SQL
    • 性能监控监控

Dapper扩展


  • ​Dapper.Contrib​​:

    • 添加简单的CRUD扩展方法
    1. connection.Insert(user);
    2. connection.Update(user);
    复制代码

  • ​Dapper.FluentMap​​:

    • 配置实体到表的映射
    1. FluentMapper.Initialize(config =>
    2. {
    3.     config.AddMap(new UserMap());
    4. });
    复制代码

  • ​DapperQueryBuilder​​:

    • 构建安全动态SQL
    1. var query = connection.QueryBuilder($"SELECT * FROM Users WHERE 1=1");
    2. if (name != null) query.Where("Name = @Name", new { Name = name });
    3. var users = query.Query<User>();
    复制代码

十、总结与建议


  • ​EF Core适合​​:

    • 快速开发的企业应用
    • 必要数据库迁移的项目
    • 团队熟悉ORM的情况

  • ​Dapper适合​​:

    • 高性能要求的微服务
    • 复杂SQL查询场景
    • 已有成熟SQL知识的项目

  • ​混合使用策略​​:

    • 主框架使用EF Core
    • 性能关键部分使用Dapper
    1. // 在EF Core项目中使用Dapper
    2. public class UserRepository : IUserRepository
    3. {
    4.     private readonly AppDbContext _context;
    5.     private readonly IDbConnection _dapperConnection;
    6.    
    7.     public UserRepository(AppDbContext context, IDbConnection dapperConnection)
    8.     {
    9.         _context = context;
    10.         _dapperConnection = dapperConnection;
    11.     }
    12.    
    13.     public User GetById(int id)
    14.     {
    15.         // 使用EF Core
    16.         return _context.Users.Find(id);
    17.     }
    18.    
    19.     public IEnumerable<User> GetActiveUsers()
    20.     {
    21.         // 使用Dapper执行复杂查询
    22.         return _dapperConnection.Query<User>("SELECT * FROM Users WHERE IsActive = 1");
    23.     }
    24. }
    复制代码

通过合理选择ORM框架并遵照最佳实践,可以显著进步.NET Core应用程序的开发效率和性能表现。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

来自云龙湖轮廓分明的月亮

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表