从Postgre迁移数据至SQL Server时遇实体跟踪冲突错误求助
问题分析
报错核心原因:你直接复用了由_rentContext(PostgreSQL上下文)跟踪的UsersUser实体实例,尝试将其添加到_rentContextSql(SQL Server上下文)中。EF Core不允许同一个实体实例被多个上下文跟踪,也不允许同一上下文同时跟踪两个同主键的实体实例。同时你的代码逻辑存在漏洞:当目标上下文存在对应记录时,对原user执行Detached操作无法解决跨上下文跟踪冲突,反而可能引发其他问题。
修复方案
核心思路是避免跨上下文复用实体实例,可通过以下两种方式解决:
方案1:无跟踪查询原数据
从PostgreSQL查询时直接取消原上下文对实体的跟踪,消除跨上下文跟踪冲突:
var time = DateTime.Now.AddMinutes(-15); var timeDateOnly = DateOnly.FromDateTime(time); // 使用AsNoTracking()让原上下文不跟踪查询到的实体 var postgresUserData = _rentContext.UsersUsers .AsNoTracking() .Where(u => u.DateJoined > time) .ToList(); foreach (var user in postgresUserData) { var existing = _rentContextSql.UsersUsers.FirstOrDefault(u => u.Id.Equals(user.Id)); if (existing == null) { _rentContextSql.UsersUsers.Add(user); } } _rentContextSql.SaveChanges();
方案2:创建新实体复制属性(更安全)
若原实体包含复杂导航属性,或担心跨上下文元数据冲突,建议创建新的UsersUser对象手动复制属性:
var time = DateTime.Now.AddMinutes(-15); var timeDateOnly = DateOnly.FromDateTime(time); var postgresUserData = _rentContext.UsersUsers .Where(u => u.DateJoined > time) .ToList(); foreach (var user in postgresUserData) { var existing = _rentContextSql.UsersUsers.FirstOrDefault(u => u.Id.Equals(user.Id)); if (existing == null) { // 新建实体并复制原数据属性 var newUser = new UsersUser { Id = user.Id, DateJoined = user.DateJoined, // 复制其他需要迁移的属性 }; _rentContextSql.UsersUsers.Add(newUser); } } _rentContextSql.SaveChanges();
性能优化:批量处理减少数据库请求
若迁移数据量较大,循环内单次查询会导致多次数据库请求,可先批量获取目标上下文已存在的ID,再批量处理:
var time = DateTime.Now.AddMinutes(-15); var timeDateOnly = DateOnly.FromDateTime(time); var postgresUserData = _rentContext.UsersUsers .AsNoTracking() .Where(u => u.DateJoined > time) .ToList(); // 批量查询目标上下文已存在的用户ID var existingUserIds = _rentContextSql.UsersUsers .Where(u => postgresUserData.Select(p => p.Id).Contains(u.Id)) .Select(u => u.Id) .ToList(); // 筛选出需要新增的用户 var usersToAdd = postgresUserData.Where(u => !existingUserIds.Contains(u.Id)).ToList(); _rentContextSql.UsersUsers.AddRange(usersToAdd); _rentContextSql.SaveChanges();
内容的提问来源于stack exchange,提问作者Hossein Gholizadeh
相关产品推荐
相关产品推荐

