Comment spécifier ON DELETE NO ACTION Contrainte de clé étrangère dans mes conceptions de modèle?
Actuellement, j'ai:
public class Status
{
[Required]
public int StatusId { get; set; }
[Required]
[DisplayName("Status")]
public string Name { get; set; }
}
public class Restuarant
{
public int RestaurantId { get; set; }
[Required]
public string Name { get; set; }
[Required]
[EmailAddress]
public string Email { get; set; }
[Required]
public string Telephone { get; set; }
[Required]
public int StatusId { get; set; }
public List<Menu> Menus { get; set; }
// NAVIGATION PROPERTIES
public virtual Status Status { get; set; }
}
public class Menu
{
public int MenuId { get; set; }
[Required]
public int RestaurantId { get; set; }
[Required]
public string Name { get; set; }
[Required]
public int StatusId { get; set; }
// NAVIGATION PROPERTIES
public virtual Status Status { get; set; }
public virtual Restaurant Restaurant { get; set; }
}
Et mon DbContext:
public class MenuEntities : DbContext
{
public DbSet<Status> Statuses { get; set; }
public DbSet<Restaurant> Restaurants { get; set; }
public DbSet<Menu> Menus { get; set; }
}
Comme vous pouvez le voir:
Naturellement, si un statut est supprimé, je ne veux certainement pas me mettre en cascade car cela gâcherait tout.
METTRE À JOUR:
Mark Oreta mentionne l'utilisation de ce qui suit dans son exemple ci-dessous:
modelBuilder.Entity<FirstEntity>()
.HasMany(f => f.SecondEntities)
.WithOptional()
.WillCascadeOnDelete(false);
Où est-ce que je mets ce code? Dans ma classe MenuEntities/DbContext? Quelqu'un peut-il donner un exemple de cette utilisation?
UPDATE: Ce bit fonctionne maintenant, cependant cela a créé une erreur de contrainte de multiplicité lorsque vous essayez d'amorcer le DB ...
Multiplicity constraint violated. The role 'Menu_Status_Source' of the relationship 'LaCascadaWebApi.Models.Menu_Status' has multiplicity 1 or 0..1.
Mon initialiseur de base de données:
Vous pouvez soit le désactiver pour l'ensemble de votre contexte en supprimant la convention de suppression en cascade de la méthode OnModelCreating:
protected override void OnModelCreating( DbModelBuilder modelBuilder )
{
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
}
ou, vous pouvez le faire par relation en utilisant un mappage fluide (également dans OnModelCreating):
EDIT: vous le mettriez dans vos entités de menu
public class MenuEntities : DbContext
{
public DbSet<Status> Statuses { get; set; }
public DbSet<Restaurant> Restaurants { get; set; }
public DbSet<Menu> Menus { get; set; }
protected override void OnModelCreating( DbModelBuilder modelBuilder )
{
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
modelBuilder.Entity<Menu>()
.HasRequired( f => f.Status )
.WithRequiredDependent()
.WillCascadeOnDelete( false );
modelBuilder.Entity<Restaurant>()
.HasRequired( f => f.Status )
.WithRequiredDependent()
.WillCascadeOnDelete( false );
}
}
Rendez la propriété FK nullable, la suppression en cascade disparaîtra.
public int? StatusId { get; set; }
Une fois les modifications apportées au modèle, veillez à régénérer le fichier de migration en ajoutant le paramètre -Force.
Add-Migration MigrationName -Force
Mettez ceci dans votre classe MenuEntities
(classe qui descend de DbContext
):
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
}