Estamos utilizando primero el código del Entity Framework con las relaciones de clave externa. Investigamos formas de manejar la eliminación de objetos de una ICollection de entidades en nuestra aplicación.¿Es posible eliminar un elemento secundario de la colección y resolver problemas en SaveChanges?
Cuando tenemos una entidad con relaciones secundarias, podemos agregar objetos directamente a su colección usando el método Agregar. Ahora cuando se utiliza retire se obtiene el error
System.InvalidOperationException se produjo Mensaje = La operación fracasó : La relación no podía ser cambiado debido a que uno o más de las propiedades de clave externa es no anulable. Cuando se realiza un cambio en una relación , la propiedad de clave foránea relacionada se establece en un valor nulo. Si la clave externa no admite valores nulos, se debe definir una nueva relación , se debe asignar a la propiedad clave externa valor no nulo o se debe eliminar el objeto no relacionado.
Entiendo que esto se debe a que Eliminar en la colección solo elimina la relación anulando la clave externa. Queríamos escribir nuestra lógica comercial en nuestra entidad y permitir su eliminación.
Así que obtenga la entidad raíz fuera de su Repositorio por ejemplo Pedido de OrderRepository luego llame a algún método específico de la entidad, p. Order.AddOrderline(Orderline orderline)
Esto añade un OrderLine a las órdenes virtual ICollection<OrderLine> OrderLines
Sin embargo, no podemos escribir código como Order.CancelOrderline(int orderLineId)
debido a la simple eliminación de la ICollection produce un error en los cambios de ahorro.
No parece ser de todos modos para lograr esto simplemente manipulando las colecciones de objetos. Obviamente, podemos eliminar directamente del contexto. Sin embargo, me gustaría hacer que forme parte de la entidad. ¿Podemos limpiar ciertas entidades sin clave externa en el evento SaveChanges de Entity Framework? Obviamente, es necesario decirle a EF qué entidades se pueden eliminar si tienen una clave externa nula.
Actualmente estamos utilizando un patrón de repositorio para que el controlador no tenga acceso al contexto. Obviamente, podría utilizar un repositorio OrderLine o un método Remove OrderLine en el repositorio de pedidos. Sin embargo, me preguntaba si era posible escribir el código en la entidad sin referencias al mecanismo de persistencia.
¿Pensamientos? ¿Nos estamos equivocando? ¿Otros ORM le permiten eliminar de Colecciones para niños?
Ah, si si hago una clave compuesta en las entidades secundarias, EF se encargará de esto por mí. Ahora eso parece bastante atractivo. – GraemeMiller
Eso fue genial, pero necesitaba agregar [Clave, columna (Orden = 0), DatabaseGenerated (DatabaseGeneratedOption.Identity)] public int OrderLineId {get; conjunto; } para que no se queje de la inserción de identidad. – GraemeMiller
@GraemeMiller: Eso es lo que quise decir con "* Puedes hacer que OrderLineId sea una identidad autogenerada si quieres *" :) Olvidé mencionar que necesitas hacer esto en el * modelo * (con DatabaseGeneratedOption) * y * en la base de datos*. – Slauma