J'ai mis en place ce que je pensais être une base de données assez simple. Cependant, j'obtiens l'erreur suivante.
L'introduction de la contrainte FOREIGN KEY 'FK_User_Suburb_SuburbId' sur la table 'User' peut provoquer des cycles ou plusieurs chemins en cascade. Spécifiez ON DELETE NO ACTION ou ON UPDATE NO ACTION, ou modifiez d'autres contraintes FOREIGN KEY. Impossible de créer une contrainte ou un index. Voir les erreurs précédentes.
Voici mon CATALOGUE
... public int? SuburbId { get; set; } public Suburb Suburb { get; set; } public int RoleId { get; set; } public Role Role { get; set; } public virtual ICollection<Tenant> Tenants { get; set; }
Voici mon utilisateur:
using JobsLedger.CATALOG.Entities; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Internal; namespace JobsLedger.CATALOG { public class CATALOGContext : DbContext { public DbSet<Tenant> Tenants { get; set; } public DbSet<User> Users { get; set; } public DbSet<Role> Roles { get; set; } public DbSet<State> States { get; set; } public DbSet<Suburb> Suburbs { get; set; } public DbSet<CATALOGCounter> Counters { get; set; } public CATALOGContext(DbContextOptions options) : base(options) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { foreach (var entity in modelBuilder.Model.GetEntityTypes()) { entity.Relational().TableName = entity.DisplayName(); } // User modelBuilder.Entity<User>().Property(u => u.UserName).IsRequired().HasMaxLength(50); modelBuilder.Entity<User>().Property(u => u.UserFirstName).IsRequired().HasMaxLength(100); modelBuilder.Entity<User>().Property(u => u.UserLastName).IsRequired().HasMaxLength(100); modelBuilder.Entity<User>().Property(u => u.Email).IsRequired().HasMaxLength(200); modelBuilder.Entity<User>().Property(u => u.HashedPassword).IsRequired().HasMaxLength(200); modelBuilder.Entity<User>().Property(u => u.Salt).IsRequired().HasMaxLength(200); modelBuilder.Entity<User>() .HasOne<Suburb>(s => s.Suburb) .WithMany(u => u.Users) .HasForeignKey(u => u.SuburbId) .IsRequired(false); // Role modelBuilder.Entity<Role>().Property(r => r.Name).IsRequired().HasMaxLength(50); modelBuilder.Entity<Role>() .HasOne<User>(u => u.User) .WithOne(r => r.Role) .HasForeignKey<User>(u => u.RoleId); // TenantAccount modelBuilder.Entity<Tenant>().Property(t => t.TenantNo).HasMaxLength(20); modelBuilder.Entity<Tenant>().Property(t => t.Company).HasMaxLength(100).IsRequired(); modelBuilder.Entity<Tenant>().Property(t => t.ContactLastName).HasDefaultValue(false).IsRequired(); modelBuilder.Entity<Tenant>().Property(t => t.Email).HasMaxLength(500).IsRequired(); modelBuilder.Entity<Tenant>().Property(t => t.MobilePhone).HasMaxLength(20).IsRequired(); modelBuilder.Entity<Tenant>().Property(t => t.OfficePhone).HasMaxLength(20); modelBuilder.Entity<Tenant>().Property(t => t.CompanyEmail).HasMaxLength(500); modelBuilder.Entity<Tenant>().Property(t => t.Address1).HasMaxLength(500); modelBuilder.Entity<Tenant>().Property(t => t.Address2).HasMaxLength(500); modelBuilder.Entity<Tenant>().Property(t => t.ABN).HasMaxLength(14); modelBuilder.Entity<Tenant>().Property(t => t.Database).HasMaxLength(100).IsRequired(); modelBuilder.Entity<Tenant>().Property(t => t.IsLocked).HasDefaultValue(false); modelBuilder.Entity<Tenant>() .HasOne<User>(s => s.User) .WithMany(ta => ta.Tenants) .HasForeignKey(u => u.UserId); modelBuilder.Entity<Tenant>() .HasOne(s => s.Suburb) .WithMany(ta => ta.Tenants) .HasForeignKey(ta => ta.SuburbId); // State modelBuilder.Entity<State>().Property(s => s.StateShortName).HasMaxLength(3).IsRequired(); modelBuilder.Entity<State>().Property(s => s.StateName).HasMaxLength(30).IsRequired(); // Suburb modelBuilder.Entity<Suburb>().Property(s => s.SuburbName).HasMaxLength(3).IsRequired(); modelBuilder.Entity<Suburb>().Property(s => s.PostCode).HasMaxLength(30).IsRequired(); modelBuilder.Entity<Suburb>() .HasOne<State>(s => s.State) .WithMany(su => su.Suburbs) .HasForeignKey(st => st.StateId); } } }
Voici ma banlieue qui a également été mentionnée.
Vous vous demandez si quelqu'un pourrait mettre en évidence pourquoi les migrations fonctionnent, mais lorsque j'essaie de lancer une base de données, cela génère une erreur avec l'erreur ci-dessus.
Simon
3 Réponses :
L'erreur indique déjà ce que vous devez faire. Spécifiez ce qu'il doit faire lorsqu'il y a une action. Vous devez ajouter la méthode .OnDelete()
à chaque définition de clé étrangère.
modelBuilder.Entity<Tenant>() .HasOne<User>(s => s.User) .WithMany(ta => ta.Tenants) .HasForeignKey(u => u.UserId) .OnDelete(DeleteBehavior.Restrict);
Pour plus d'informations, veuillez lire https://www.learnentityframeworkcore.com/configuration/fluent-api/ondelete-method
La configuration de votre entité User
ForeignFey
Fluent API doit être la suivante:
modelBuilder.Entity<User>() .HasOne<Suburb>(s => s.Suburb) .WithMany(u => u.Users) .HasForeignKey(u => u.SuburbId) .IsRequired(false); .OnDelete(DeleteBehavior.Restrict); // <-- Here it is
Pour les autres qui trouvent cette question, cela suffit:
modelBuilder.Entity<User>() .HasOne(u => u.Suburb) .WithMany() .OnDelete(DeleteBehavior.Restrict);
Si vous ne voulez pas de propriété de liste dans Suburb
with Users
vous pouvez également le faire comme ceci:
modelBuilder.Entity<User>() .HasOne(u => u.Suburb) .WithMany(s => s.Users) .OnDelete(DeleteBehavior.Restrict);