La relación no se pudo cambiar porque una o más de las propiedades de clave foránea no son anulables. (2)

Estoy usando Entity Framework 6.1.3 en una aplicación .NET 4.5 con Code First y un esquema de tabla hecho a mano en un servidor de base de datos Oracle. La mayoría de las cosas funcionan bien. Para una nueva función, la siguiente excepción es lanzada en SaveChanges :

La operación falló: la relación no se pudo cambiar porque una o más de las propiedades de clave foránea no son anulables. 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 foránea no admite valores nulos, se debe definir una nueva relación, la propiedad de clave foránea debe tener asignado otro valor no nulo o el objeto no relacionado debe eliminarse.

Rastreo de stack:

  • System.Data.Entity.Core.Objects.ObjectContext.PrepareToSaveChanges (System.Data.Entity.Core.Objects.SaveOptions)
  • System.Data.Entity.Core.Objects.ObjectContext.SaveChangesInternal (System.Data.Entity.Core.Objects.SaveOptions, bool)
  • System.Data.Entity.Internal.InternalContext.SaveChanges ()
  • (mi código)

No dice nada sobre el problema. No me ayuda a encontrarlo. El registro de SQL está vacío, así que supongo que el problema fue detectado localmente por EF antes de intentar llegar a la base de datos.

Mi pregunta es: ¿Cómo puedo depurar esto? ¿Dónde están los detalles sobre qué clave externa en qué objeto tiene qué valor pero no debería tenerlo? ¿Hay registros de seguimiento disponibles para Entity Framework que contengan datos internos sobre lo que se hizo?

La situación es demasiado compleja para mostrarla aquí, así que no la solicites. Quiero ayudarme a salir de esto, solo necesito ayuda con eso.

Puede anular el método SaveChanges de DBContext, y ver qué todas las propiedades son actualizadas / eliminadas / modificadas, minimizará la lista que necesita para verificar su error. Necesitaba solo los borrados / separados, pero puede modificarlos en cualquier lugar que necesite.

 public override int SaveChanges() { try { var debug = false; if (debug) { var modifiedEntities = ChangeTracker.Entries() .Where(p => p.State == EntityState.Deleted || p.State == EntityState.Detached).ToList(); foreach (var change in modifiedEntities) { var entityName = change.Entity.GetType().Name; System.Diagnostics.Debug.WriteLine(string.Format("Entity {0}", entityName)); } } return base.SaveChanges(); } catch (DbEntityValidationException e) { foreach (var eve in e.EntityValidationErrors) { Debug.WriteLine("Error while Save Changes:"); Debug.WriteLine("Entity {0} has the following validation errors:", eve.Entry.Entity.GetType().Name); foreach (var ve in eve.ValidationErrors) { Debug.WriteLine("Property:{0}, Error: {1}", ve.PropertyName, ve.ErrorMessage); } } throw; } catch (Exception) { throw; } }