Ho un modello di database molto complesso. Il mio programma calcola alcuni data+db entries
e modifies+generates new entries
da aggiornare + inserire nel database.
Quando utilizzo il contesto del database per inserire le voci, tutto funziona. Ma quando provo a salvare le modifiche:
{"L'operazione non è riuscita: la relazione non può essere modificata perché una o più proprietà della chiave esterna non sono annullabili. Quando viene apportata una modifica a una relazione, la relativa proprietà della chiave esterna viene impostata su un valore nullo. la chiave esterna non supporta valori nulli, una nuova relazione deve essere definita, la proprietà chiave esterna deve essere assegnata a un altro valore non nullo o l'oggetto non correlato deve essere eliminato. "}
Ho visto troppe domande su SO su questo argomento. Ma il mio problema è che il modello è così complesso che non riesco a tenere traccia del problema. Entity Framework 6 non mi fornisce alcuna informazione sulla fonte del problema, nome della relazione, ...
C'è un modo per ottenere più aiuto da Entity Framework al fine di trovare la fonte del problema?
Devi analizzare il tuo oggetto per risolvere questo problema.
Ecco alcuni semplici codici per spiegare la tua Exception
:
static void Main()
{
using (MyDbContext ctx = new MyDbContext())
{
// Build a new object
MyClass o = new MyClass() { Id = 1, ChildObject = null };
// Add it to your Context (It's not in the DB yet!)
ctx.MyObjects.Add(o);
// Write all changes (the new object) to the Db
ctx.SaveChanges();
}
}
// You got some DbContext with a DbSet pointing to your Table "MyTable"
public class MyDbContext : DbContext
{
public DbSet<MyClass> MyObjects { get; set; }
}
// You've got a class to map your table to some nice object.
[Table("MyTable")]
public class MyClass
{
// Some column..
[Key]
public int Id { get; set; }
// And some ForeignKey! Which maps a column with the Id to an object.
[ForeignKey("ChildObjectId")]
public MyClass ChildObject { get; set; }
}
In questo esempio creo un contesto aggiungo un oggetto e salvi le modifiche (crea un inserto nella tabella).
1 °: L'eccezione si verifica su SaveChanges, perché la proprietà "ChildObject" può essere impostata su null, perché non abbiamo alcuna restrizione su quella proprietà.
2: L'eccezione è un'eccezione Db. Il tuo programma è (probabilmente) runnging corretto. Ma il tuo Db ti dice che non è consentito avere una riga in MyTable senza un riferimento a ChildObject.
Devi metterti in dubbio se il db è configurato male (Rendi la colonna nullable) o se il tuo programma si dimentica di impostare il bambino.
Spero che tu veda: devi scavare nel tuo codice. Hai un problema con il tuo 'modello completo' e devi risolverlo.
Prendi in considerazione la lettura del log SQL del contesto. Esempio: ctx.Log = Console.WriteLine;
(Non ho uno Studio qui, ma penso che dovrei essere qualcosa del genere).
In questo modo puoi prendere l'ultima SQL-Query ed eseguirla sul tuo Db per ottenere migliori output di errore.