2012-10-13 233 views
20

¿Cómo especifico ON DELETE NO ACTION Restricción de clave foránea en los diseños de mi modelo?Especifique ELIMINAR SIN ACCIÓN en ASP.NET MVC 4 C# Code First

En la actualidad, tengo:

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

Y mi DbContext:

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

Como se puede ver:

  • un restaurante tiene muchos menús
  • un restaurante tiene un estado
  • a Menú pertenece a 1 restaurante
  • Ambos restaurantes y menús tienen 1 estado. (Live, Invisible, Borrador)

Naturalmente, si se elimina un estado, que desde luego no quiere poner en cascada, ya que esto lodo todo.

ACTUALIZACIÓN:

Marcos Oreta menciones usando lo siguiente en su siguiente ejemplo:

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

¿Dónde pongo el código? Dentro de mi clase MenuEntities/DbContext? ¿Alguien puede dar un ejemplo de esto?

ACTUALIZACIÓN: Llegamos a este poco de trabajo ahora, sin embargo, esto ha creado un error de restricción de multiplicidad cuando se trata de sembrar el DB ...

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

mi base de datos initialiser:

http://pastebin.com/T2XWsAqk

Respuesta

47

Puede deshabilitarlo para todo su contexto eliminando la convención de eliminación en cascada en el método OnModelCreating:

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

o, lo puede hacer por relación mediante un mapeo de fluidez (también en el OnModelCreating):

EDIT: que pondría en sus entidades de menú

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

     } 

} 
+0

¿Dónde está el método OnModelCreating? ¿Cómo puedo encontrarlo? – Gravy

+0

Actualicé mi respuesta, pero la pondrías en tu clase de MenuEntities, no necesitarías poner tanto la eliminación de la convención como el mapeo fluido (elegir uno u otro), pero puse ambos para que pudieras ver cómo los usaría. –

+1

Gracias Marcar, Actualizado, pero aún problemas ... Ver la actualización en la pregunta – Gravy

0

poner esto en su clase MenuEntities (clase que desciende de DbContext):

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

Después de realizar los cambios en el modelo, asegúrese de regenerar el archivo de migración agregando el parámetro -Fuerza.

Add-Migración MigrationName -Force

0

solo hago los anulable propiedad FK, entonces la eliminación en cascada se ha ido.

public int? StatusId { get; set; } 
Cuestiones relacionadas