升级Pomelo.EntityFrameworkCore.MySql 7.0.0后,插入记录后Find返回null求助
解决Pomelo.EntityFrameworkCore.MySql 7.0.0升级后SaveChanges视图查询返回null的问题
问题根源
升级到Pomelo 7.0.0(基于EF Core 7)后,EF Core的连接复用和事务处理逻辑有调整。结合MySQL默认的REPEATABLE READ(可重复读)隔离级别,同一DbContext实例下,SaveChanges提交后,后续查询会复用同一个数据库连接,而该连接的事务上下文仍保留提交前的数据快照,导致普通查询无法看到刚插入的记录;只有使用READ UNCOMMITTED隔离级别时才能绕过快照看到数据。
解决方案
1. 全局修改默认事务隔离级别(推荐,无大量代码修改)
在你的DbContext的OnConfiguring方法中,设置默认事务隔离级别为READ COMMITTED(读已提交)。该级别下,提交后的修改会立即对当前连接的后续查询可见:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { var connectionString = "你的数据库连接字符串"; optionsBuilder.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString)) .SetDefaultTransactionIsolationLevel(IsolationLevel.ReadCommitted); }
2. 封装SaveChanges扩展方法,强制刷新连接
如果不想修改全局隔离级别,可以封装一个扩展方法,在SaveChanges后关闭并重新打开连接,让后续查询使用新连接(新连接会读取最新数据):
using System.Data; using Microsoft.EntityFrameworkCore; public static class DbContextExtensions { public static void SaveChangesAndRefreshConnection(this DbContext context) { context.SaveChanges(); var connection = context.Database.GetDbConnection(); if (connection.State == ConnectionState.Open) { connection.Close(); connection.Open(); } } }
将代码中所有的dbContext.SaveChanges()替换为dbContext.SaveChangesAndRefreshConnection()即可。
3. 排查视图查询的SQL正确性
如果以上方法无效,开启EF Core的SQL日志,检查Find方法生成的SQL是否正确查询了视图的主键列:
optionsBuilder.LogTo(Console.WriteLine, LogLevel.Information);
若生成的SQL存在问题,可改用FromSqlRaw直接查询视图:
var entity = dbContext.MyView.FromSqlRaw("SELECT * FROM YourView WHERE Id = {0}", id).FirstOrDefault();
内容的提问来源于stack exchange,提问作者Big boy
相关产品推荐
相关产品推荐

