【发布时间】:2020-03-23 19:48:20
【问题描述】:
我有以下表格:
public class Team
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Required]
public string Name { get; set; }
public virtual ICollection<UserTeam> UserTeams { get; set; }
}
public class User
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Required]
public string Name { get; set; }
public virtual ICollection<UserTeam> UserTeams { get; set; }
}
public class UserTeam
{
public long UserId { get; set; }
public User User { get; set; }
public long TeamId { get; set; }
public Team Team { get; set; }
}
多对多关系在上下文中定义:
modelBuilder.Entity<UserTeam>()
.HasKey(bc => new { bc.UserId, bc.TeamId });
modelBuilder.Entity<UserTeam>()
.HasOne(bc => bc.User)
.WithMany(b => b.UserTeams)
.HasForeignKey(bc => bc.UserId)
.OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity<UserTeam>()
.HasOne(bc => bc.Team)
.WithMany(c => c.UserTeams)
.HasForeignKey(bc => bc.TeamId)
.OnDelete(DeleteBehavior.Restrict);
我正在尝试使用以下代码从团队中删除一些用户:
public async Task RemoveUsersFromTeam(int teamId, List<long> users)
{
Team existingTeam = await dbContext.Team.Include(x => x.UserTeams).FirstOrDefaultAsync(x => x.Id == teamId);
foreach (var user in users)
{
existingTeam.UserTeams.Remove(new UserTeam { UserId = user });
}
await dbContext.SaveAsync();
}
但是这个查询并没有删除我通过的用户。有谁知道为什么会这样?
【问题讨论】:
-
你有
.OnDelete(DeleteBehavior.Restrict); -
是的,这是在您删除父级(团队或用户)时使用的
-
您不必先将
UserTeam附加到上下文中吗? -
但这不是一个断开连接的场景。首先我查询团队(已附加)然后我修改它。不应该跟踪变化吗?
-
您正在创建
UserTeam,因此您需要让 EF 知道它已经存在,例如将其附加到图表中。至少在 EF 6 中。见stackoverflow.com/questions/2471433/…
标签: c# .net-core entity-framework-core ef-core-2.2