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:
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:
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 );
}
}
Machen Sie einfach die FK-Eigenschaft null, dann ist das Löschen der Kaskade weg.
public int? StatusId { get; set; }
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
Fügen Sie dies in Ihre MenuEntities
-Klasse ein (Klasse, die von DbContext
abstammt):
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
}
füge diese Zeile am Ende des Feldes im Kontext hinzu;
.OnDelete (DeleteBehavior.Restrict);