我正在使用EntityFramework Core 2.2版。
我有三个实体:团队,玩家和便笺。每个团队可以为每个玩家提供一个便笺,因此一个玩家可能有多个团队为他做笔记。一个便签只能有一个团队和一个球员。
public class Team
{
public int ID {get; set;}
public ICollection<Note> Notes { get; set; }
public ICollection<Player> Players { get; set; }
}
public class Player
{
public int ID {get; set;}
public ICollection<Note> Notes { get; set; }
public int TeamID {get; set;}
[ForeignKey("TeamID")]
public Team Team {get; set;}
}
public class Note
{
public int ID { get; set; }
// Navigation property
public int? PlayerID { get; set; }
[ForeignKey("PlayerID")]
public Player Player { get; set; }
// Navigation property
public int? TeamID { get; set; }
[ForeignKey("TeamID")]
public Team Team { get; set; }
public string Text { get; set; }
}
在预期的行为中,如果从数据库中删除了团队或球员,则必须删除与该团队或球员有关的所有最终注释。而且,通常我希望使用PlayerID和TeamID的组合作为搜索关键字来搜索笔记。 这就是为什么我向ApplicationDbContext的OnModelCreating添加以下说明的原因:
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<Note>()
.HasKey(n => new { n.PlayerID, n.TeamID });
builder.Entity<Team>()
.HasMany(t => t.Notes)
.WithOne(n => n.Team)
.OnDelete(DeleteBehavior.Cascade);
builder.Entity<Player>()
.HasMany(n => n.Notes)
.WithOne(w => w.Player)
.OnDelete(DeleteBehavior.Cascade);
}
当我要求使用EntityFramework命令Add-Migration将新实体和OnModelCreating规则添加到数据库中时,生成以下Up-Migration一切正常:
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Notes",
columns: table => new
{
PlayerID = table.Column<int>(nullable: false),
TeamID = table.Column<int>(nullable: false),
Text = table.Column<string>(maxLength: 512, nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Notes", x => new { x.PlayerID, x.TeamID });
table.ForeignKey(
name: "FK_Notes_Player_PlayerID",
column: x => x.PlayerID,
principalTable: "Player",
principalColumn: "ID",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_Notes_Team_TeamID",
column: x => x.TeamID,
principalTable: "Team",
principalColumn: "ID",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_Notes_TeamID",
table: "Notes",
column: "TeamID");
}
当需要通过迁移更新数据库时,Update-Database会生成一个错误,并带有以下SqlException(从意大利语翻译为英语): System.Data.SqlClient.SqlException(0x80131904):表'Notes'中的FOREIGN KEY'FK_Notes_Team_TeamID'可以确定周期的创建或多个传播路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION或修改其他FOREIGN KEY约束。
在此StackOverflow帖子Entity Framework Code First 5 Cascade Delete on many to many tables error之后,我了解到MsSql不接受多个OnDelete级联约束。我改为更改了代码设置DeleteBehavior.ClientSetNull(并使int为外键PlayerID和TeamID),但是我想知道是否存在一种在删除团队或玩家时使用EntityFramework创建自动Notes删除功能的方法。>