You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 07:45:35