asp.net 如何在EF Core建模类中实现外键约束

kzipqqlq  于 5个月前  发布在  .NET
关注(0)|答案(1)|浏览(95)

我有以下模型类:

public enum Roster
{
    None,
    One,
    Two,
    Three,
    Four
}

[Index(nameof(UniColumn), IsUnique = true)]
internal class RowRosterEnum
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    [EnumDataType(typeof(Roster))]
    public Roster RosterEnum { get; set; }

    public Roster UniColumn { get; set; }
}

internal class RowRoster
{
    [Key]
    [ForeignKey(nameof(RowRosterEnum))]
    public Roster RId { get; set; }

    public string? Name { get; set; }

    public RowRosterEnum RowRosterEnum { get; set; }

}

字符串
当我创建迁移文件时,会生成以下代码:

migrationBuilder.CreateTable(
                name: "TableRosterEnum",
                columns: table => new
                {
                    RosterEnum = table.Column<int>(type: "int", nullable: false),
                    UniColumn = table.Column<int>(type: "int", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_TableRosterEnum", x => x.RosterEnum);
                });

            migrationBuilder.CreateTable(
                name: "TableRoster",
                columns: table => new
                {
                    RId = table.Column<int>(type: "int", nullable: false),
                    Name = table.Column<string>(type: "nvarchar(max)", nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_TableRoster", x => x.RId);
                    table.ForeignKey(
                        name: "FK_TableRoster_TableRosterEnum_RId",
                        column: x => x.RId,
                        principalTable: "TableRosterEnum",
                        principalColumn: "RosterEnum",
                        onDelete: ReferentialAction.Cascade);
                });

            migrationBuilder.CreateIndex(
                name: "IX_TableRosterEnum_UniColumn",
                table: "TableRosterEnum",
                column: "UniColumn",
                unique: true);


是否可以修改模型类,因此外键来自UniColumn而不是RosterEnum,基本上我希望像这样生成迁移代码:

principalColumn: "UniColumn",


我希望RosterEnum仍然是主键。

cs7cruho

cs7cruho1#

您可以尝试在DbContext类中定义关系,如下所示。

public class RowRoster
    {
        [Key]
        public Roster RId { get; set; }

        public string? Name { get; set; }

        [ForeignKey(nameof(RowRosterEnum))]
        public Roster UniColumn { get; set; }
        public RowRosterEnum RowRosterEnum { get; set; }

    }

个字符
上下文

public class MyContext : DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseMySql("server=192.168.2.68;database=WA119;user=mysql1;password=Q!q11111", new MySqlServerVersion(new Version()));
        }

        public DbSet<RowRosterEnum> TableRosterEnum { get; set; }
        public DbSet<RowRoster> TableRoster { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<RowRoster>()
                .HasOne(x => x.RowRosterEnum)
                .WithOne(x => x.RowRoster)
                .HasPrincipalKey<RowRosterEnum>(x => x.UniColumn);               
        }
    }


测试


的数据

相关问题