我有以下实体(为简洁起见,以下简称);
public class Trader : AuditableEntity
{
public int? UserId { get; set; }
public ApplicationUser User { get; set; }
public int? AccountManagerId { get; set; }
public ApplicationUser AccountManager { get; set; }
public List<TraderContactHistory> ContactHistory { get; set; }
}
public class ApplicationUser : IdentityUser<int>, IEntity
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Level { get; set; }
public DateTime JoinDate { get; set; }
public DateTime? LastLogin { get; set; }
public ApplicationUserImage ProfileImage { get; set; }
}
为了完整起见,TraderContactHistory
如下:
public class TraderContactHistory : Entity
{
public Trader Trader { get; set; }
public DateTime ContactDate { get; set; }
public ApplicationUser ContactedBy { get; set; }
public bool RequestedCallbackLater { get; set; }
public string Notes { get; set; }
}
现在添加约束后;
public override void Configure(EntityTypeBuilder<Trader> entity)
{
entity.HasOne(x => x.User)
.WithOne()
.HasForeignKey<Trader>(x => x.UserId)
.OnDelete(DeleteBehavior.Restrict);
}
以下内容(因为我们现在需要删除交易者时清除相关用户);
public override void Configure(EntityTypeBuilder<Trader> entity)
{
entity.HasOne(x => x.User)
.WithOne()
.HasForeignKey<Trader>(x => x.UserId)
.OnDelete(DeleteBehavior.Cascade);
entity.HasOne(x => x.AccountManager)
.WithMany()
.HasForeignKey(x => x.AccountManagerId)
.OnDelete(DeleteBehavior.SetNull);
}
为了完整起见,TraderContactHistory
配置是;
public override void Configure(EntityTypeBuilder<TraderContactHistory> entity)
{
entity.HasKey(x => x.Id);
entity.HasOne(x => x.Trader)
.WithMany(x => x.ContactHistory)
.OnDelete(DeleteBehavior.Restrict);
entity.HasOne(x => x.ContactedBy)
.WithMany()
.OnDelete(DeleteBehavior.Restrict);
}
产生以下迁移;
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_Traders_AspNetUsers_UserId",
schema: "Bemfeito",
table: "Traders");
migrationBuilder.AddForeignKey(
name: "FK_Traders_AspNetUsers_UserId",
schema: "Bemfeito",
table: "Traders",
column: "UserId",
principalSchema: "Bemfeito",
principalTable: "AspNetUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
}
运行时导致以下错误update-database
(我正在运行MSSQL数据库);
System.Data.SqlClient.SqlException(0x80131904):在表“ Traders”上引入FOREIGN KEY约束“ FK_Traders_AspNetUsers_UserId”可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。
谁能看到为什么会这样吗?可能是与的TraderContactHistory
链接Trader
无声地造成了这种情况吗?由于我目前没有配置设置?
数据模型中的外键关系如下所示:
因此,如果删除ApplicationUser条目,则级联删除将删除所有Trader条目和指向它的所有TraderContactHistory条目。但是,删除操盘手条目也将删除相应的操盘手条目。因此,您有两个从ApplicationUser到TraderContactHistory的级联删除路径:
MSSQL不喜欢这样。相信我,我知道这会令人讨厌,因为我必须定期处理此限制。
话虽如此,您在TraderContactHistory的关系中指定了“ Restrict”,可以解决该问题。也许实际的模式不能正确反映出来?
编辑:
在我看来,另一个直接的Trader-ApplicationUser-relationship可能是罪魁祸首。如果将Trader-AccountManager-dependency设置为OnDelete Cascade,您还将获得多个级联路径。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句