awaisshabir Ответов: 2

Я получил ошибку, когда я запускаю миграции в рамках сущности основных


Введение ограничения внешнего ключа 'FK_PMS_UserRoles_PMS_Users_UserId' в таблице 'PMS_UserRoles' может привести к циклам или нескольким каскадным путям. Укажите при удалении без действия или при обновлении без действия или измените другие ограничения внешнего ключа.
Не удалось создать ограничение или индекс. Смотрите предыдущие ошибки.

Что я уже пробовал:

public class PMS_Company : IBaseEntity
    {
        public PMS_Company()
        {
            Users = new HashSet<PMS_User>();
            Roles = new HashSet<PMS_Role>();
          
        }
       
        public int Id { get; set; }
        public string CompanyName { get; set; }
        public string RegistrationNo { get; set; }
        public string OwnerName { get; set; }
        public string Logo { get; set; }
        public string Address { get; set; }
        public string PhoneNumber { get; set; }
        public bool IsActive { get; set; }
        public int CreatedBy { get; set; }
        public DateTime CreatedOn { get; set; }
        public int? EditedBy { get; set; }
        public DateTime? EditedOn { get; set; }
 
 
        public IReadOnlyCollection<PMS_User> Users { get; set; }
        public IReadOnlyCollection<PMS_Role> Roles { get; set; }
       
    }
public class PMS_User : IBaseEntity
    {
        public PMS_User()
        {
          UserRoles = new HashSet<PMS_UserRole>();
        }
        public int Id { get ; set ; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Email { get; set; }
        public string Paswword { get; set; }
        public string salt { get; set; }
        public DateTime ExpireDate { get; set; }
        public bool IsActive { get ; set ; }
        public int CreatedBy { get ; set ; }
        public DateTime CreatedOn { get ; set ; }
        public int? EditedBy { get ; set ; }
        public DateTime? EditedOn { get ; set ; }
 
        public int CompanyId { get; set; }
        public PMS_Company Company { get; set; }
 
        public IReadOnlyCollection<PMS_UserRole> UserRoles { get; set; }
    }
 
  public class PMS_UserRole 
    {
        
        public int UserId { get; set; }
        public PMS_User User { get; set; }
        public int RoleId { get; set; }
        public PMS_Role Role { get; set; }
    }
 
  public class PMS_Role : IBaseEntity
    {
        public PMS_Role()
        {
           UserRoles = new HashSet<PMS_UserRole>();
        }
        public int Id { get ; set; }
        public string RoleName { get; set; }
        public string RoleNameN { get; set; }
        public bool IsActive { get; set; }
        public int CreatedBy { get; set; }
        public DateTime CreatedOn { get; set; }
        public int? EditedBy { get; set; }
        public DateTime? EditedOn { get; set; }
 
        public int CompanyId { get; set; }  
        public PMS_Company Company { get; set; }
 
       public IReadOnlyCollection<PMS_UserRole> UserRoles { get; set; }
        
    }
 
 public class UserRolesConfiguration : IEntityTypeConfiguration<PMS_UserRole>
    {
        public void Configure(EntityTypeBuilder<PMS_UserRole> builder)
        {
            builder.ToTable("PMS_UserRoles");
 
            builder.HasKey(x => new { x.RoleId, x.UserId });
            builder.HasOne(ur => ur.Role)
                .WithMany(x => x.UserRoles)
                .HasForeignKey(x => x.RoleId);
            builder.HasOne(ur => ur.User)
                .WithMany(x => x.UserRoles)
                .HasForeignKey(x => x.UserId);
        }
    }

2 Ответов

Рейтинг:
0

Afzaal Ahmad Zeeshan

Цитата:
Введение ограничения внешнего ключа 'FK_PMS_UserRoles_PMS_Users_UserId' в таблице 'PMS_UserRoles' может привести к циклам или нескольким каскадным путям. Укажите при удалении без действия или при обновлении без действия или измените другие ограничения внешнего ключа.
Сама ошибка объясняет себя, внешний ключ, создаваемый в этой миграции, скорее всего, вызовет цикл; соединение в таблицах.

Это хороший подход, чтобы переоценить схему базы данных и посмотреть, как это происходит. Вы можете попробовать прочитать документацию по этим причинам, чтобы понять, что это такое, как здесь: .net - введение ограничения внешнего ключа может привести к циклам или нескольким каскадным путям - почему? - переполнение стека[^]


Рейтинг:
0

Richard Deeming

Ключ в том что это фраза "несколько каскадных путей" Это означает, что удаление одной сущности может привести к удалению другой сущности с помощью нескольких связей.

В этом случае удаление a PMS_Company удалит как пользователей, так и роли в этой компании. Удаление пользователей приведет к удалению связанных с ними данных. PMS_UserRole сущности. Удаление ролей приведет к удалению связанных с ними ролей. PMS_UserRole сущности. Таким образом, существует два пути, по которым одно удаление может привести к PMS_UserRole быть удаленным, что SQL Server не позволяет.

Сообщение об ошибке 1785 возникает при создании ограничения внешнего ключа, которое может вызвать несколько каскадных путей[^]

Это досадное ограничение, но с ним нужно жить. Вам придется изменить одно или несколько отношений, чтобы они не каскадировались при удалении. Если вы хотите удалить родительскую сущность, вам нужно будет вручную удалить связанные сущности, а не полагаться на поведение каскадного удаления.

Например:

builder.HasOne(ur => ur.Role)
    .WithMany(x => x.UserRoles)
    .HasForeignKey(x => x.RoleId)
    .OnDelete(DeleteBehavior.None);
Каскадное удаление - EF Core | Microsoft Docs[^]