¿Especificando ON DELETE NO ACTION en Entity Framework 7?

entity-framework-core

Pregunta

En Entity Framework 7, cuando intento aplicar una migración, aparece el error.

La introducción de la restricción FOREIGN KEY 'FK_ChangeOrder_User_CreatedByID' en la tabla 'ChangeOrder' puede causar ciclos o múltiples rutas en cascada. Especifique ON DELETE NO ACTION o ON UPDATE NO ACTION, o modifique otras restricciones FOREIGN KEY.
No se pudo crear la restricción. Ver errores anteriores.

Sé que en las versiones anteriores de Entity Framework usted lidiaría con esto agregando

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

para DbContext, pero en EF7 modelBuilder no parece tener un .Conventions a él y google solo está devolviendo EF 4 anterior a EF 6.

¿Cómo especifico la restricción ON DELETE NO ACTION en Entity Framework 7?

Edit: La respuesta proporcionada por Oleg aparentemente lo hará por clave externa, pero me gustaría hacerlo a nivel mundial, ya que será mucho más fácil usar una línea de código para declarar esto globalmente, luego tengo que especificar el código para cada uno de los Cientos de relaciones acabaré teniendo.

Edición 2: Código para Oleg

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

Respuesta aceptada

Después de profundizar en GitHub y trabajar con un tipo muy paciente de MS allí, la solución actual es agregar esto a DbContext

protected override void OnModelCreating(ModelBuilder modelbuilder)
{
    foreach (var relationship in modelbuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
    {
        relationship.DeleteBehavior = DeleteBehavior.Restrict;
    }

    base.OnModelCreating(modelbuilder);
}

Respuesta popular

La construcción

modelBuilder.Entity("myNamespace.Models.ChangeOrder", b =>
    {
        b.HasOne("myNamespace.Models.User")
            .WithMany()
            .HasForeignKey("CreatedByID")
            .OnDelete(DeleteBehavior.Cascade);
    });

significa crear FK_ChangeOrder_User_CreatedByID con REFERENCES [dbo].[User] ([CreatedByID]) ON DELETE CASCADE . Debería existir en protected override void BuildModel(ModelBuilder modelBuilder) de YourContextModelSnapshot.cs creado durante la migración. No estoy seguro de que entiendo su pregunta, pero creo que debería agregar dicha construcción a XXXModelSnapshot.cs o eliminar una construcción innecesaria, que ya existe aquí.

ACTUALIZADO: veo que tienes el problema en el modelo. Tienes las siguientes propiedades en

modelBuilder.Entity("myNamespace.Models.ChangeOrder", b =>
    {
        b.HasOne("myNamespace.Models.User")
            .WithMany()
            .HasForeignKey("CreatedByID")
            .OnDelete(DeleteBehavior.Cascade);
    });

Por defecto, la migración intenta establecer DeleteBehavior.Cascade en todas las propiedades.

Puede sobrescribir el comportamiento cambiando OnModelCreating , que establece el comportamiento DeleteBehavior.Restrict para todas las claves o para configurar en una sola clave el comportamiento DeleteBehavior.Cascade o DeleteBehavior.SetNull . Por ejemplo, el código siguiente utiliza DeleteBehavior.Cascade en CreatedByID (que crea ON DELETE CASCADE en las claves externas) y DeleteBehavior.Restrict en otras claves externas (no ON DELETE en las claves externas):

modelBuilder.Entity("myNamespace.Models.ChangeOrder", b =>
    {
        b.HasOne("myNamespace.Models.User")
            .WithMany()
            .HasForeignKey("CreatedByID")
            .OnDelete(DeleteBehavior.Cascade);
    });



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué