it-swarm.com.de

Geben Sie zuerst ON DELETE NO ACTION in ASP.NET MVC 4 C # -Code an

Wie kann ich in meinen Modellentwürfen festlegen, dass keine Fremdschlüsseleinschränkung ON DELETE NO ACTION vorhanden ist?

Zur Zeit habe ich:

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

Und mein DbContext:

public class MenuEntities : DbContext
{
    public DbSet<Status> Statuses { get; set; }
    public DbSet<Restaurant> Restaurants { get; set; }
    public DbSet<Menu> Menus { get; set; }
}

Wie du siehst: 

  • ein Restaurant hat viele Menüs
  • ein Restaurant hat einen Status
  • ein Menü gehört zu 1 Restaurant
  • Sowohl Restaurants als auch Menüs haben 1 Status. (Live, unsichtbar, Entwurf)

Wenn ein Status gelöscht wird, möchte ich natürlich nicht kaskadieren, da dies alles vermasseln wird.

UPDATE:

Mark Oreta erwähnt in seinem Beispiel das Folgende: 

modelBuilder.Entity<FirstEntity>() 
    .HasMany(f => f.SecondEntities) 
    .WithOptional() 
    .WillCascadeOnDelete(false); 

Wo gebe ich diesen Code ein? In meiner MenuEntities/DbContext-Klasse? Kann jemand ein Beispiel dafür geben?

UPDATE: Dieses Bit ist jetzt funktionsfähig. Dies hat jedoch einen Multiplizitätsfehler verursacht, wenn versucht wird, den DB zu starten.

Multiplicity constraint violated. The role 'Menu_Status_Source' of the relationship 'LaCascadaWebApi.Models.Menu_Status' has multiplicity 1 or 0..1.

Mein Datenbankinitialisierer:

http://Pastebin.com/T2XWsAqk

24
Gravy

Sie können es entweder für den gesamten Kontext deaktivieren, indem Sie die Kaskaden-Löschkonvention in der OnModelCreating-Methode entfernen:

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

oder Sie können dies pro Beziehung mit einem fließenden Mapping (auch im OnModelCreating) tun:

BEARBEITEN: Sie würden es in Ihre Menüelemente setzen

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

Machen Sie einfach die FK-Eigenschaft null, dann ist das Löschen der Kaskade weg. 

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

Nachdem Sie die Änderungen am Modell vorgenommen haben, stellen Sie sicher, dass Sie die Migrationsdatei neu erstellen, indem Sie den Parameter -Force hinzufügen.

Add-Migration MigrationName -Force

1
Ali Sakhi

Fügen Sie dies in Ihre MenuEntities-Klasse ein (Klasse, die von DbContext abstammt):

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

füge diese Zeile am Ende des Feldes im Kontext hinzu;

.OnDelete (DeleteBehavior.Restrict);

0
Ghadir Farzaneh