tutorial net mvc framework first español code asp and c# asp.net-mvc entity-framework foreign-keys code-first

c# - net - entity framework code first tutorial español



Especifique ON DELETE NO ACTION en ASP.NET MVC 4 C#Code First (4)

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

Add-Migration MigrationName -Force

¿Cómo especifico ON DELETE NO ACTION Restricción de clave externa en los diseños de mi modelo?

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 puedes ver:

  • un restaurante tiene muchos menus
  • un restaurante tiene un estado
  • un menú pertenece a 1 restaurante
  • Tanto los restaurantes como los menús tienen 1 estatus. (En vivo, invisible, borrador)

Naturalmente, si se elimina un estado, ciertamente no quiero hacer una cascada ya que esto desordenará todo.

ACTUALIZAR:

Mark Oreta menciona el uso de lo siguiente en su ejemplo a continuación:

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

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

ACTUALIZACIÓN: Tengo este bit funcionando ahora, sin embargo, esto ha creado un error de restricción de multiplicidad cuando se intenta generar el DB ...

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

Inicializador de mi base de datos:

http://pastebin.com/T2XWsAqk


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

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


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, puede hacerlo por relación usando un mapeo fluido (también en OnModelCreating):

EDITAR: lo pondrías en tu menú de entidades.

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


Simplemente haga que la propiedad FK sea anulable, luego la eliminación en cascada desaparecerá.

public int? StatusId { get; set; }