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