He notado una molesta discrepancia en Breeze.js entre eliminar una entidad aún no persistente (EntityState = "Added") y una entidad persistente con respecto a cualquier referencia a ella (claves externas).

Este puede ser un problema relacionado con la generación de claves temporales para nuevas entidades. En este caso, generamos números negativos para claves temporales (ID), reemplazados por las claves reales cuando persisten.

Esto se explicará más fácilmente con un ejemplo concreto. Digamos que tenemos una entidad llamada Persona que tiene una referencia a una entidad Título ("Sr.", "Sra.", Etc.):

export class Person extends EntityBase {
    id: number;
    firstName: string;
    lastName: string;
    titleId: number;
    title: Title;
    ...
}

export class Title extends EntityBase {
    id: number;
    name: string;
    ...
}

Ahora, si tenemos una entidad Title persistente en nuestro contexto actual y llamamos a .setDeleted () en ella, tanto la propiedad titleId como la propiedad de navegación del título en las entidades Person aplicables se establecen en nulo.

Sin embargo, si la entidad Título tiene un EntityState de "Agregado", solo la propiedad de navegación del título en todas las entidades Persona vinculadas se establece en nulo. La propiedad titleId conserva su valor, lo que genera un error al guardar (una violación de restricción de clave externa).

Esto significa que eliminar una entidad de Título con un EntityState de "Agregado" requiere establecer explícitamente la propiedad titleId en nula para todas las entidades de Persona vinculadas.

Quizás valga la pena señalar que la columna TitleID en la base de datos subyacente es anulable. Si no fuera así, por supuesto, tendríamos que establecer la propiedad titleId en un valor adecuado.

Parece una torpeza tener que hacer esto. ¿Este comportamiento es intencional, por alguna razón que se me escapa?

1
Mark Farr 24 ene. 2018 a las 04:37

1 respuesta

Creo que este es un caso en el que Breeze debería modificarse para manejar las eliminaciones de entidades Added de forma un poco más inteligente. Mientras tanto, sin embargo, lo siguiente podría representar una solución (no he tenido la oportunidad de probarlo hasta ahora).

En primer lugar, para las entidades Added que se eliminan, el problema parece ser que las propiedades de navegación que hacen referencia a la entidad no se actualizan para eliminar estas referencias. Podría ser posible engañar a Breeze para que se encargue de esto.

  1. Primero establezca el estado de la entidad agregada que se eliminará en algo como Unchanged.
  2. Elimina la entidad. Debido a que el estado de la entidad ya no es Added, la lógica que traduce Eliminar en Separar no se aplicará. La entidad tendrá su estado establecido en Deleted y las propiedades de navegación que hacen referencia a ella se actualizarán para que ya no lo hagan.
  3. Dejar la entidad con un estado de Deleted sería un problema ya que habría un intento de eliminar una entidad que en realidad no existe. Establezca su estado en Separado para evitar esto.

Entonces, en lugar de simplemente eliminar, intente establecer el estado en Unchanged, luego elimine y finalmente establezca el estado en Detached.

1
Scott Munro 8 feb. 2018 a las 07:11