web-dev-qa-db-fra.com

Spécifiez ON DELETE NO ACTION dans le code ASP.NET MVC 4 C # en premier

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: 

  • un restaurant a beaucoup de menus
  • un restaurant a un statut
  • un Menu appartient à 1 restaurant
  • Les restaurants et les menus ont 1 statut. (Live, Invisible, Draft)

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:

http://Pastebin.com/T2XWsAqk

24
Gravy

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 );

      }

}
52
Mark Oreta

Rendez la propriété FK nullable, la suppression en cascade disparaîtra. 

public int? StatusId { get; set; }
6
Bob Yang

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

1
Ali Sakhi

Mettez ceci dans votre classe MenuEntities (classe qui descend de DbContext):

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 
}
0
Lionfoo