【发布时间】: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