I'm adding a new entity that is built through an external class and I get this error : A referential integrity constraint violation occurred: A primary key property that is a part of referential integrity constraint cannot be changed when the dependent object is Unchanged unless it is being set to the association's principal object. The principal object must be tracked and not marked for deletion.
:
Edit : The ReconFact
entity is not linked to any other entities
The code (edited) :
// the context class
AccountingModelContext db = new AccountingModelContext();
// query some data
List<Reconciliation> recon = db.Reconciliations
.Where(r => r.ReconNum == 112293) // scenario 18
.Include(r => r.ReconciliationDetails.Select(rd => rd.JrnlEntryDetail).Select(jd => jd.JrnlEntry).Select(j => j.ARInvoices.Select(i => i.ARInvoiceDetails)))
.Include(r => r.ReconciliationDetails.Select(rd => rd.JrnlEntryDetail).Select(jd => jd.JrnlEntry).Select(j => j.ARCredMemoes.Select(c => c.ARCredMemoDetails)))
.ToList();
// class that will manager business logic and generate facts with above data
ReconFactGenerator generator = new ReconFactGenerator(recon);
// call to the method that will return a list of facts
List<ReconFact> scenario18 = generator.GenerateFacts();
// ERROR RAISED HERE
scenario18.ForEach(f => db.ReconFacts.Add(f));
// never reached
db.SaveChanges();
It's very basic I build a list of ReconFact
entities with ReconFactGenerator
class. No ID's are specified as they are new entities.
edited It works perfectly if I create a new entity in the same method like here Before I query data from the context :
ReconFact testfact = new ReconFact { ItemCode = "test", ReconNum = 1234, ReconDate = DateTime.Parse("2099-01-01"), ShortName = "L_SZTREDFD", InvoiceAmount = 0, CredMemoAmount = 0, IncomingPayAmount = 0, OutgoingPayAmount = 0, JrnlEntryAmount = 0, OtherAmount = 0 };
db.ReconFacts.Add(testfact); // no problems no error raised
db.SaveChanges(); // I can see the new record in my database
// the ID was generated successfully
// as I've specified identity(1,1) in the database
Added Edit 2 After I query data from the context like this :
List<Reconciliation> recon = db.Reconciliations
.Where(r => r.ReconNum == 112293) // scenario 18
.Include(r => r.ReconciliationDetails.Select(rd => rd.JrnlEntryDetail).Select(jd => jd.JrnlEntry).Select(j => j.ARInvoices.Select(i => i.ARInvoiceDetails)))
.Include(r => r.ReconciliationDetails.Select(rd => rd.JrnlEntryDetail).Select(jd => jd.JrnlEntry).Select(j => j.ARCredMemoes.Select(c => c.ARCredMemoDetails)))
.ToList();
The context is not able to save anymore returning the above error.
edited Why is an error raised when I want to save after I query the context and raises no error before ?
Found out how to get around though it doesn't explain why the error occurs :
// the context class
AccountingModelContext db = new AccountingModelContext();
// query some data
List<Reconciliation> recon = db.Reconciliations
.Where(r => r.ReconNum == 112293) // scenario 18
.Include(r => r.ReconciliationDetails.Select(rd => rd.JrnlEntryDetail).Select(jd => jd.JrnlEntry).Select(j => j.ARInvoices.Select(i => i.ARInvoiceDetails)))
.Include(r => r.ReconciliationDetails.Select(rd => rd.JrnlEntryDetail).Select(jd => jd.JrnlEntry).Select(j => j.ARCredMemoes.Select(c => c.ARCredMemoDetails)))
.ToList();
// class that will manager business logic and generate facts with above data
ReconFactGenerator generator = new ReconFactGenerator(recon);
// call to the method that will return a list of facts
List<ReconFact> scenario18 = generator.GenerateFacts();
// ERROR RAISED HERE
// scenario18.ForEach(f => db.ReconFacts.Add(f));
// INSTEAD OF REUSING THE CONTEXT I CREATE A NEW ONE PROBLEM SOLVED !
using (db = new AccountingModelContext())
{
scenario18.ForEach(f => db.ReconFacts.Add(f));
db.SaveChanges();
}
db.SaveChanges();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With