【问题标题】:Foreign Key becomes unique while migrating迁移时外键变得唯一
【发布时间】:2019-06-28 10:58:54
【问题描述】:

这是主员工表实体,同时迁移外键成为唯一且不允许表中有重复值。

我需要为 exitdetail 实体中的单个员工添加多个数据,因此我创建了从员工表到 ExitDetailEntity 表的外键引用,但外键在迁移时成为唯一键并且不允许重复。

public class EmployeeDetailEntity : Entity
{
    [Required]
    [StringLength(12)]
    public string EmployeeId { get; set; }

    [Required]
    [StringLength(64)]
    public string FirstName { get; set; }

    [StringLength(64)]
    public string MiddleName { get; set; }

    [StringLength(256)]
    public string FullName { get; set; }

    [StringLength(64)]
    public string LastName { get; set; }
}

这个表有一个来自EmployeeDetail的外键引用

public class ExitDetailEntity : Entity
{
    public int EmployeeDetailId {get; set; }
    public EmployeeDetailEntity EmployeeDetail {get; set; }

    public ExitStatusEnum ExitStatus {get; set;}
}

此表有来自 ExitDetil 表的引用

public class ExitDetailAdminEntity : Entity
{
    public int ExitDetailId {get; set; }
    public ExitDetailEntity ExitDetail {get; set; }

    public bool HasTaskCompleted {get; set;}
}

这是exitdetail中提到的枚举

public enum ExitStatusEnum
{
   Active = 0,
   Resigned = 1,
   Requested = 2,
   Cancelled = 3

}

这是exitdetailentity表的迁移命令

migrationBuilder.CreateTable(
            name: "ExitDetail",
            columns: table => new
            {
                Id = table.Column<int>(nullable: false)
                    .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
                CreatedBy = table.Column<string>(maxLength: 32, nullable: false),
                CreatedAt = table.Column<DateTime>(nullable: false),
                ModifiedBy = table.Column<string>(maxLength: 32, nullable: true),
                ModifiedAt = table.Column<DateTime>(nullable: true),
                RowVersion = table.Column<byte[]>(rowVersion: true, nullable: true),
                IsDeleted = table.Column<bool>(nullable: false),
                EmployeeDetailId = table.Column<int>(nullable: false),
                RequestStatus = table.Column<int>(nullable: false),
                ApprovalStatus = table.Column<int>(nullable: false)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_ExitDetail", x => x.Id);
                table.ForeignKey(
                    name: "FK_ExitDetail_EmployeeDetail_EmployeeDetailId",
                    column: x => x.EmployeeDetailId,
                    principalTable: "EmployeeDetail",
                    principalColumn: "Id",
                    onDelete: ReferentialAction.Cascade);
            });

这是唯一索引变为真的行

 migrationBuilder.CreateIndex(
            name: "IX_ExitDetail_EmployeeDetailId",
            table: "ExitDetail",
            column: "EmployeeDetailId",
            unique: true);

这是我的 onmodelcreating 方法中的代码

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<LocationCodeTable>().HasQueryFilter(x => !x.IsDeleted);
        modelBuilder.Entity<OfficeCodeTable>().HasQueryFilter(x => !x.IsDeleted);
        modelBuilder.Entity<DivisionCodeTable>().HasQueryFilter(x => !x.IsDeleted);
        modelBuilder.Entity<RoleCodeTable>().HasQueryFilter(x => !x.IsDeleted);
        modelBuilder.Entity<TeamCodeTable>().HasQueryFilter(x => !x.IsDeleted);
        modelBuilder.Entity<FunctionCodeTable>().HasQueryFilter(x => !x.IsDeleted);
        modelBuilder.Entity<DesignationCodeTable>().HasQueryFilter(x => !x.IsDeleted);
        modelBuilder.Entity<LevelCodeTable>().HasQueryFilter(x => !x.IsDeleted);
        modelBuilder.Entity<ShiftCodeTable>().HasQueryFilter(x => !x.IsDeleted);
        modelBuilder.Entity<RegularizationTypeCodeTable>().HasQueryFilter(x => !x.IsDeleted);
        modelBuilder.Entity<EmployeeDetailEntity>().HasQueryFilter(x => !x.IsDeleted);

        modelBuilder
            .Entity<EmployeeDetailEntity>()
            .HasOne(x => x.ManagerRef)
            .WithMany()
            .OnDelete(DeleteBehavior.Restrict);

        modelBuilder
            .Entity<EmployeeDetailEntity>()
            .HasIndex(x => x.EmployeeId)
            .IsUnique();

        modelBuilder
           .Entity<EmployeeDetailEntity>()
           .HasIndex(x => x.DomainName);
    }

【问题讨论】:

  • 能否请您添加使外键唯一的迁移代码?
  • @Alexander 对不起,这个错误是我工作中发生的,我没有迁移代码,我到那里后会提供它,我需要对此进行任何修改吗代码
  • 请告诉我Entity 拥有哪些属性,我会检查有什么问题
  • 我已经使用这些实体创建了迁移,一切对我来说都很好。你有实体配置吗?
  • 感谢@Alexander 的回复,只有这些是实体拥有的属性,而迁移 ExitDetailEntity 中的 EmpoyeeDetailEntity 引用将成为唯一键并且不接受任何重复值

标签: c# asp.net-core-2.1 ef-core-2.1


【解决方案1】:

您需要为每个相关实体定义一个主键,例如:

public class ExitDetailEntity : Entity
{
    public int Id {get; set; } //primary key
    public int EmployeeDetailId {get; set; }
    public EmployeeDetailEntity EmployeeDetail {get; set; }
    public ExitStatusEnum ExitStatus {get; set;}
}

那么所有其他属性都不会是唯一的。

你可以看到: https://docs.microsoft.com/en-us/ef/core/modeling/keys

【讨论】:

  • 我扩展的实体有Id属性,所以它有一个主键
猜你喜欢
  • 1970-01-01
  • 2015-10-27
  • 2018-12-07
  • 2020-06-05
  • 1970-01-01
  • 2019-08-22
  • 2017-02-14
  • 2016-06-06
  • 2019-09-23
相关资源
最近更新 更多