2012-08-14 12 views
9

Estoy utilizando la función de migración EF 4.3 para crear scripts de migración de base de datos. Cuando corro Añadir a la migración de comandos del script generado se crea como tal:Migración de EntityFramework parámetro de cascadaDelete

 CreateTable(
      "dbo.Recipients", 
      c => new 
       { 
        RecipientID = c.String(nullable: false, maxLength: 128), 
        SurveyRoundID = c.String(nullable: false, maxLength: 128), 
        LastUpdatedAt = c.DateTime(), 
       }) 
      .PrimaryKey(t => t.RecipientID) 
      .ForeignKey("dbo.Employees", t => t.EmployeeID, cascadeDelete: true) 
      .ForeignKey("dbo.SurveyRounds", t => t.SurveyRoundID, cascadeDelete: true) 
      .Index(t => t.EmployeeID) 
      .Index(t => t.SurveyRoundID); 

El problema que tengo es que la migración scafolding elegir cascadeDelete para ser verdad a pesar de que el Receptor entidad no es el maestro de la relación.

Por ahora voy a cambiar manualmente el parámetro cascadeDelete a falso, pero me gustaría saber por qué la elección de cierto por defecto.

Gracias, Ido.

Respuesta

8

Funciona como se esperaba. No es la entidad principal en la relación y debido a eso define la restricción de clave externa y esta restricción tiene la opción de eliminación en cascada. Configuración de eliminación en cascada true (por defecto en el código EF primero a menos que quite la convención o la cambie en el mapeo de fluidez) dice que si se elimina Employee constancia de la eliminación en cascada dará lugar a la eliminación de Recipient (lo mismo se aplica en SurveyRounds).

Este modelo no es realmente ideal para eliminación en cascada porque la entidad depende de múltiples relaciones. Debe eliminar la eliminación en cascada directamente en la asignación de entidad.

+0

¿Conoce cómo definir 'ON DELETE SET null' sin recurrir a DDL con sql (..)' en una migración? – JoeBrockhaus

11

Gracias por la respuesta, que me ayudaron cuando estaba notando ya veces tener errores al intentar actualizar la base de datos ya que varios de mis clases tienen múltiples relaciones haciendo eliminación en cascada no es ideal.

favor ver más abajo para la eliminación de eliminación en cascada configuración predeterminada:

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

Esta clase Context ir dentro.

+0

¡Exactamente lo que estaba buscando! – Mixxiphoid

+1

Eso funcionó bien para mí. Esto realmente debería ser opt-in en lugar de opt-out! –

Cuestiones relacionadas