首页 > 解决方案 > EF Core:迁移中重复的外键

问题描述

这是我第一个使用 Entity Framework Core 的项目,有时这些关系让我有点困惑。问题是当我创建数据库迁移时,它总是添加我没有定义的外键。所以我不能使用数据库,因为插入新值会引发重复的条目异常。

但首先是我的配置的一些代码:

public class User : IdentityUser
{
    public virtual List<SignatureToUser> Signatures { get; set; }
}

public class SignatureToUser
{
    [Key]
    [Required]
    public int SignatureToUserID { get; set; }

    public int SignatureID { get; set; }

    [Required]
    [ForeignKey("SignatureID")]
    public virtual Signature Signature { get; set; }

    public string SignatureUserID { get; set; }

    [Required]
    [ForeignKey("SignatureUserID")]
    public virtual User User { get; set; }
}

这就是我使用的构建器选项

modelBuilder.Entity<SignatureToUser>().HasOne(l => l.User).WithOne().OnDelete(DeleteBehavior.ClientNoAction);
        modelBuilder.Entity<SignatureToUser>().HasOne(l => l.Signature).WithOne().OnDelete(DeleteBehavior.ClientNoAction);
        modelBuilder.Entity<SignatureToUser>().HasIndex(l => l.SignatureUserID).IsUnique(false);
        modelBuilder.Entity<SignatureToUser>().HasIndex(l => l.SignatureID).IsUnique(false);

现在的问题是:这是生成的迁移:

migrationBuilder.CreateTable(
            name: "SignatureToUser",
            columns: table => new
            {
                SignatureToUserID = table.Column<int>(type: "int", nullable: false)
                    .Annotation("SqlServer:Identity", "1, 1"),
                SignatureID = table.Column<int>(type: "int", nullable: false),
                SignatureUserID = table.Column<string>(type: "nvarchar(450)", nullable: false),
                UserId = table.Column<string>(type: "nvarchar(450)", nullable: true)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_SignatureToUser", x => x.SignatureToUserID);
                table.ForeignKey(
                    name: "FK_SignatureToUser_AspNetUsers_SignatureUserID",
                    column: x => x.SignatureUserID,
                    principalTable: "AspNetUsers",
                    principalColumn: "Id");
                table.ForeignKey(
                    name: "FK_SignatureToUser_AspNetUsers_UserId",
                    column: x => x.UserId,
                    principalTable: "AspNetUsers",
                    principalColumn: "Id",
                    onDelete: ReferentialAction.Restrict);

如您所见,有一个外键UserId作为副本添加到我已经存在的 keySignatureUserID中。

如何禁用此附加外键的创建?

在我的研究中,我还听说基类可能是个问题。这仍然是一个问题吗?我也尝试过类似的方法来欺骗基类,但没有任何变化。

public class User : IdentityUser
{
    [Key]
    public string Id { get { return base.Id; } set { base.Id = value; } }
}

感谢您阅读 :) 我希望有人有想法

标签: c#entity-framework-coreforeign-keys

解决方案


推荐阅读