创建具有多个一对多关系和DeleteBehavior的实体

时间:2020-05-10 08:50:08

标签: c# entity-framework-core

我正在使用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删除功能的方法。

0 个答案:

没有答案