L'unica cosa che posso pensare è una condizione di competizione, ma sia la funzione di chiamata che la linea di codice sono sincrone per quanto ne so.
/// <summary>
/// Gets the log format string for an info-level log.
/// </summary>
public static string Info<T>(string action, T obj)
{
var stringBuilder = new StringBuilder(String.Format(
"Action: {0} \tObject: {1} \tUser: {2} \tJson: ",
action, typeof(T).Name, User
));
// Set all virtual properties to null. This should stop circular references of navigation properties.
var virtualProperties = typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(x => x.GetSetMethod().IsVirtual && !x.PropertyType.IsPrimitive);
foreach (var propInfo in virtualProperties)
{
propInfo.SetValue(obj, null); // This Line is the culprit.
}
GetJsonSerializer().Serialize(obj, stringBuilder);
return stringBuilder.ToString();
}
La riga propInfo.SetValue(obj, null)
verrà eseguita se ho appena il punto di interruzione prima del ciclo e passo uno alla volta (o semplicemente interrompo su quella linea), tuttavia se non utilizzo un punto di interruzione non imposta mai la proprietà ( ies) su null. Perchè è questo?
Dettagli specifici :
propInfo.SetValue(obj, null);
funziona. null
a 5
(che non è un valore valido) genera un'eccezione che dice che non è un valore valido. Per chiarire, "Non funziona" significa che non imposta la proprietà su null.
Quello che ho provato:
default(T)
) MODIFICARE
È stato limitato il fatto che le proprietà di navigazione EF sono la causa di questo comportamento. Il codice è in esecuzione ma per qualche motivo le proprietà di navigazione si rifiutano di diventare nulle. Quindi, quali sono le proprietà di navigazione che causano questo comportamento?
Lazy-Caricamento in corso
Le proprietà di navigazione erano lazy-loading, quindi quando il serializzatore le guardava venivano sovrascritte dal valore originale. Quindi l'impostazione di null funzionava tutto il tempo ma veniva sovrascritta dal caricamento lento.
Debug
Il motivo per cui il debug è apparso come era perché stavo guardando il valore prima di eseguire la riga di codice SetValue. Ciò ha causato la proprietà di navigazione per caricare il valore prima dell'esecuzione della riga di codice che ha come risultato che il valore null non viene sovrascritto.
Soluzione
foreach (var propInfo in virtualProperties)
{
propInfo.GetValue(obj); // Trigger any navigation property to load.
propInfo.SetValue(obj, null);
}
Ho avuto un problema MOLTO simile in un primo codice EF6 molti-a-molti. Nel mio controller API Web avevo impostato la proprietà di navigazione di un oggetto da valori impostati da un DTO. Uno è stato passato al mio repository, le proprietà non sono state aggiornate a causa del caricamento lento, ma in modalità debug funzionerebbe se mi fossi avvicinato a quella sezione di codice. Ho finito per usare:
try {
TheDatabase.Configuration.LazyLoadingEnabled = false;
...
...
}
finally {
TheDatabase.Configuration.LazyLoadingEnabled = true;
}
Sembra che funzioni fino ad ora. Dato che il mio dbContext è stato smaltito per controller, non penso che sarà un problema.