Die Instanz der entity-Typ 'BookLoan' kann nicht verfolgt werden
Ich bin versucht, zu aktualisieren eine Entität, und ich habe in den folgenden Fehler:
InvalidOperationException: Die Instanz der entity-Typ 'BookLoan'
kann nicht verfolgt werden, weil eine andere Instanz dieses Typs mit dem gleichen
Schlüssel wird bereits verfolgt. Beim hinzufügen neuer Entitäten, für die meisten Schlüssel
Arten einen eindeutigen temporären Schlüssel-Wert erstellt werden, wenn kein Schlüssel festgelegt ist
(d.h., wenn die key-Eigenschaft ist der Standardwert zugeordnet, die für seinen Typ).
Wenn Sie explizit festlegen Schlüssel-Werte für die neuen Einheiten, sicherzustellen, dass Sie
nicht kollidieren mit bestehenden Einrichtungen oder temporäre Werte generiert
für andere neue Einheiten. Bei der Befestigung der vorhandenen Einrichtungen, sicherzustellen, dass
nur eine Person-Instanz mit einem gegebenen Schlüssel-Wert verbunden ist, um den
Kontext.
Ich habe getan ein wenig Forschung und von dem, was ich sagen kann, ich bin offenbar versucht, eine Spur bereits verfolgt, entity wenn ich _context.Update(bookloan);
aber ich bin mir nicht wirklich sicher, was zu tun ist.
Was ich versuche zu tun ist, aktualisieren Sie eine vorhandene Entität-Datensatz in meiner Datenbank. Hier sind die get-und post-Controllern bin ich mir nicht sicher, was anderes zu teilen.
Bekommen
[HttpGet]
public async Task<IActionResult> Return(int? id)
{
if (id == null)
{
return NotFound();
}
if (isBookCheckedOut(id) == false)
{
//Not checked out
return RedirectToAction("Index");
}
else
{
var bookloan = (from book in _context.Books.Where(b => b.BookId == id)
join loan in _context.BookLoans.Where(x => !x.ReturnedOn.HasValue) on book.BookId equals loan.BookID into result
from loanWithDefault in result.DefaultIfEmpty()
select new BookReturnViewModel
{
BookLoanID = loanWithDefault.BookLoanID,
BookID = book.BookId,
Title = book.Title,
StudentID = loanWithDefault == null ? null : loanWithDefault.StudentID,
StudentFristName = loanWithDefault == null ? null : loanWithDefault.Student.FirstName,
StudentLastName = loanWithDefault == null ? null : loanWithDefault.Student.LastName,
//Fines
CheckedOutOn = loanWithDefault == null ? (DateTime?)null : loanWithDefault.CheckedOutOn,
IsAvailable = loanWithDefault == null,
AvailableOn = loanWithDefault == null ? (DateTime?)null : loanWithDefault.DueOn
}).FirstOrDefault();
if (bookloan == null)
{
return NotFound();
}
return View(bookloan);
}
}
Post:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Return(BookReturnViewModel model)
{
if (ModelState.IsValid && isBookCheckedOut(1) == true)
{
var bookloan = new BookLoan()
{
BookLoanID = model.BookLoanID,
BookID = model.BookID,
StudentID = model.StudentID,
CheckedOutOn = (DateTime)model.CheckedOutOn,
DueOn = (DateTime)model.AvailableOn,
ReturnedOn = DateTime.Now
};
try
{
_context.Update(bookloan);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
}
return RedirectToAction("Index");
}
else
{
}
return View();
}
- Anstelle oder 'erstellen' eine neue
BookLoan
, Holen Sie sich die vorhandenen Entität aus der Datenbank basierend auf der ID (z.B.BookLoan data = db.BookLoans.Where(x => x.BookLoanID == model.BookLoanID).FirstOrDefault();
) und aktualisieren Sie Ihre Eigenschaften basierend auf der view-Modell und speichern Sie es dann. - Danke, das funktioniert perfekt! Ich würde mark, die als die Antwort, aber ich glaube nicht, dass ich das nicht für Kommentare. Die Art, wie ich versuche zu tun, es war mir einfach imitiert, was ich gesehen habe Entität tun, wenn ein edit mit Gerüst gemacht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihrem Kontext beinhaltet bereits die Entität, so dass eher eine neue zu erstellen, Holen Sie sich die vorhandenen ein auf der Grundlage der ID der Entität und aktualisieren Sie Ihre Eigenschaften, dann speichern Sie es
Seite Hinweis: wenn die Rücksendung der Ansicht, die gute Praxis, pass zurück, das Modell mit
return View(model);
- Ihre Formular-Steuerelemente werden richtig gefüllt, auch wenn Sie nicht (weil Sie die Werte vonModelState
), aber wenn Sie alle Verweise auf das Modell Eigenschaften (z.B.<div>@Model.someProperty</div>
) es würde eine exception werfen.