Entity framework 将实体添加到列表时EF核心跟踪问题
我在开发我的小Blazor WASM应用程序时遇到了一个问题。 我的应用程序的一部分是用户可以创建团队,并邀请其他用户加入他们的团队。相关实体类别为:Entity framework 将实体添加到列表时EF核心跟踪问题,entity-framework,entity-framework-core,blazor,blazor-webassembly,Entity Framework,Entity Framework Core,Blazor,Blazor Webassembly,我在开发我的小Blazor WASM应用程序时遇到了一个问题。 我的应用程序的一部分是用户可以创建团队,并邀请其他用户加入他们的团队。相关实体类别为: Team.cs public class Team { [Key] public Guid TeamID { get; set; } public string Name { get; set; } public string Abbreviation { g
Team.cs
public class Team
{
[Key]
public Guid TeamID { get; set; }
public string Name { get; set; }
public string Abbreviation { get; set; }
public Guid? BadgeID { get; set; }
public Guid TownID { get; set; }
public Guid StatisticsID { get; set; }
public Guid CaptainID { get; set; }
public List<AppUserDTO> Players { get; set; } = new();
}
但是,当我想将更改保存到服务器时,服务器端会出现以下异常:
System.InvalidOperationException: The instance of entity type 'AppUserDTO' cannot be tracked because another instance with the same key value for {'ID'} is already being tracked. When attaching existing entities, ensure that only one entity instance with a given key value is attached.
服务器端代码为:
public Team UpdateTeam(Team team)
{
var updatedTeam = _appDbContext.Teams.Include(t => t.Players).FirstOrDefault(t => t.TeamID == team.TeamID);
if (updatedTeam == null) return null;
updatedTeam.TeamID = team.TeamID;
updatedTeam.Name = team.Name;
updatedTeam.Abbreviation = team.Abbreviation;
updatedTeam.TownID = team.TownID;
updatedTeam.StatisticsID = team.StatisticsID;
updatedTeam.Players = team.Players;
updatedTeam.CaptainID = team.CaptainID;
_appDbContext.SaveChanges();
return updatedTeam;
}
异常会在_appDbContext.SaveChanges()方法中弹出
我注意到的是:当我将一个实体添加到一个空列表并保存它时,我没有得到任何异常,但是如果列表已经有实体,我会得到这个错误
对此,我认为解决方案是什么?我尝试做的事情很常见,但我在任何地方都没有找到解决方案。执行时:
var updatedTeam = _appDbContext.Teams
..Include(t => t.Players).FirstOrDefault(t => t.TeamID == team.TeamID);
。。。您正在从数据库中检索现有播放机,并且_appDbContext正在跟踪它们(通过“ID”)
现在,当您设置玩家时:
updatedTeam.Players = team.Players;
。。。我怀疑这个团队。玩家包括已经被appDbContext跟踪的玩家。这就是你的错误
你可以试试:
List<Player> playersToAdd = team.Players.Except(updatedTeam.Players);
updatedTeam.AddRange(playersToAdd);
List playersToAdd=team.Players.Except(更新的team.Players);
更新的team.AddRange(playersToAdd);
这样,您就不会将重复的玩家添加到已从初始数据库检索跟踪的上下文中。可能
updatedTeam.players.AddRange(team.players)
?@SvyatoslavDanyliv相同的异常。在我看来,你的建议毫无意义,因为updatedTeam已经有了一些玩家,而团队将有相同的玩家+1,即将加入。奇怪的是,为什么team
hasAppUserDTO
类。DTO不应该是DB模型的一部分。
updatedTeam.Players = team.Players;
List<Player> playersToAdd = team.Players.Except(updatedTeam.Players);
updatedTeam.AddRange(playersToAdd);