【发布时间】:2021-06-11 23:54:42
【问题描述】:
我正在使用.NET 5 并使用EF Core 和MSSQL 作为数据库。
我有 2 个类,它们之间有多对多的关系。那些从模型迁移到数据库。 example of DB tables
迁移:
migrationBuilder.CreateTable(
name: "TournamentUser",
columns: table => new
{
TournamentsId = table.Column<int>(type: "int", nullable: false),
UsersId = table.Column<int>(type: "int", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_TournamentUser", x => new { x.TournamentsId, x.UsersId });
table.ForeignKey(
name: "FK_TournamentUser_Tournaments_TournamentsId",
column: x => x.TournamentsId,
principalTable: "Tournaments",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_TournamentUser_Users_UsersId",
column: x => x.UsersId,
principalTable: "Users",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
型号:
public class Tournament
{
[Key]
public int Id { get; set; }
[Required, MaxLength(20)]
public string Name { get; set; }
[Required]
public int MaxPlayers { get; set; }
public int PlayersCount { get; set; }
[Required]
public DateTime Start { get; set; }
public bool IsStarted { get; set; }
public bool IsEnded { get; set; }
public List<User> Users { get; set; }
}
public class User
{
[Key]
public int Id { get; set; }
[Required, MaxLength(15)]
public string Username { get; set; }
[Required]
public string Password { get; set; }
[Required, MaxLength(20)]
public string Name { get; set; }
[Required, MaxLength(20)]
public string Surname { get; set; }
[JsonIgnore]
public List<Tournament> Tournaments { get; set; }
}
所以当我尝试更新锦标赛模型时
[HttpPut]
public async Task<ActionResult<Tournament>> Put([FromBody] Tournament tournament)
{
_context.Tournaments.Update(tournament);
await _context.SaveChangesAsync();
return CreatedAtAction(nameof(GetTournament), new { id = tournament.Id }, tournament);
}
我收到此错误
Microsoft.Data.SqlClient.SqlException (0x80131904):违反 主键约束“PK_TournamentUser”。不能插入重复 键入对象“dbo.TournamentUser”。重复键值为 (1, 1)。
对此有什么可能的解决方案?我想保持我的多对多表更新,因为每次更新 Tournament 时都可以删除或添加 Tournament's User。
编辑:
以下显示了锦标赛对象数据 -
【问题讨论】:
-
您能否展示您正在尝试更新的 Tournament 锦标赛对象,好吗?是否包括用户?
-
我将它附在帖子的末尾。它确实包括已插入到先前更新操作中的用户。不知何故,更新锦标赛强制插入所有用户锦标赛关系,即使它已经有一个。
标签: c# sql-server asp.net-core entity-framework-core many-to-many