Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 将实体添加到列表时EF核心跟踪问题_Entity Framework_Entity Framework Core_Blazor_Blazor Webassembly - Fatal编程技术网

Entity framework 将实体添加到列表时EF核心跟踪问题

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

我在开发我的小Blazor WASM应用程序时遇到了一个问题。 我的应用程序的一部分是用户可以创建团队,并邀请其他用户加入他们的团队。相关实体类别为:

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
has
AppUserDTO
类。DTO不应该是DB模型的一部分。
  updatedTeam.Players = team.Players;
List<Player> playersToAdd = team.Players.Except(updatedTeam.Players);
updatedTeam.AddRange(playersToAdd);