У меня есть следующие сущности (которые сокращены для краткости);
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): Введение ограничения FOREIGN KEY 'FK_Traders_AspNetUsers_UserId' в таблицу 'Traders' может привести к возникновению циклов или нескольких каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION, или измените другие ограничения FOREIGN KEY.
Может кто-нибудь увидеть, почему это генерируется? Может ли это быть TraderContactHistory
, связанное с Trader
, которое молча вызывает это? Как у меня в настоящее время нет конфигурации для него?