Ich entwickelte eine Webanwendung mit ASP.NET MVC 4 und SQL Server 2008, ich erstelle ContextManager-Klasse, um nur einen Datenbankkontext auf allen Seiten zu haben.DbContext wurde entfernt
public static class ContextManager
{
public static HotelContext Current
{
get
{
var key = "Hotel_" + HttpContext.Current.GetHashCode().ToString("x")
+ Thread.CurrentContext.ContextID.ToString();
var context = HttpContext.Current.Items[key] as HotelContext;
if (context == null)
{
context = new HotelContext();
HttpContext.Current.Items[key] = context;
}
return context;
}
}
}
Es funktioniert in den meisten Seiten, aber in Registrierungsseite etwas schief geht und mein Zusammenhang mit folgendem Fehler abgesetzt gegangen:
The operation cannot be completed because the DbContext has been disposed.
public ActionResult Register (RegisterModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
try
{
WebSecurity.CreateUserAndAccount(model.UserName, model.Password,
new
{
Email = model.Email,
IsActive = true,
Contact_Id = Contact.Unknown.Id
});
//Add Contact for this User.
var contact = new Contact { Firstname = model.FirstName, LastName = model.Lastname };
_db.Contacts.Add(contact);
var user = _db.Users.First(u => u.Username == model.UserName);
user.Contact = contact;
_db.SaveChanges();
WebSecurity.Login(model.UserName, model.Password);
an der Linie _db.Contacts.Add(contact);
Ich habe die Ausnahme .
Aber ohne ContextManager mit von
HotelContext _db = ContextManager.Current;
ausgetauscht wurden durch:
HotelContext _db = new HotelContext();
das Problem gelöst wurde. Aber ich muss meinen eigenen ContextManager verwenden. Was ist das Problem?
Das Problem tritt nach dem Erstellen des Benutzers und ich überprüft auch meine db, um sicher zu gehen, WebSecurity.CreateUserAndAccount ist erfolgreich, aber bei _db.Contacts.Add (Kontakt); Ich habe die Ausnahme. –
@ ken2k, der ContextManager speichert den DbContext in HttpContext.Current.Items, so dass es eine neue Instanz pro Anfrage sein wird. – mendel