EntityState.Deleted no funciona, ¿Quitar (entidad) sí?

He estado luchando con EF al intentar leer los registros y luego eliminarlos en la misma transacción. Inicialmente estaba usando el método EntityState.Deleted, que daría un error:

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

Pero si lo cambio por el que tengo debajo, usando .Remove (), entonces todo está bien.

¿Cuál es la diferencia y los mejores tiempos para usar .Remove () vs .Deleted?¿Cómo podría hacer este trabajo utilizando el método .Deleted? He intentado crear una nueva instancia del contexto en mi repositorio para leer y otra para eliminar, pero luego obtuve errores relacionados con IEntityTracker que no pueden rastrear varias instancias ... También intenté. Incluir en la lectura inicial para cargar los registros dependientes en EF por lo que conoce y elimina. También intenté .Detaching los registros de lectura primero. Todo fue en vano.

Aquí está el método en cuestión. Tenga en cuenta que tengo un repositorio genérico que utiliza el método .Deleted que me ha servido bien hasta este escenario (leyendo y luego borrando los mismos registros).

//Delete Allocation Need and AllocatedContainers for alloc need id
public ActionConfirmation<int> DeleteAllocRecords(int intFacilityId, AllocNeedSourceTypes needSourceType, int intNeedSourceId)
{
var context = new InventoryMgmtContext();
var repository = new AllocationNeedRepository(context);

//Delete Allocation Need and hence children in Allocated Containers
var srcType = needSourceType.ToString();
List<AllocationNeed> allocNeeds = repository.SearchFor(
    x => x.FacilityId == intFacilityId
    && x.NeedSourceType == srcType
    && x.NeedSourceId == intNeedSourceId
).ToList();

//var deleteRepository = new Repository<AllocationNeed>(); <--tried separate instance of context to delete...no worky.

foreach (AllocationNeed allocNeed in allocNeeds)
{
    try
    {
        //NO WORK: context.Entry(allocNeed).State = System.Data.EntityState.Deleted;
        context.AllocationNeeds.Attach(allocNeed); 
        context.AllocationNeeds.Remove(allocNeed); <-- Works
        context.SaveChanges();
    }
    catch (Exception ex)
    {
        return ActionConfirmation<int>.CreateFailureConfirmation(ex.Message, allocNeed.Id);
    }
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta