У меня есть веб-сайт, который использует ASP.NET MVC 5 с EF6.1, и у меня возникла проблема с его отображением старых данных после процедуры редактирования. Данные сохраняются в базе данных должным образом, но при перенаправлении на просмотр индекса все еще отображаются старые данные.Задание обновления DBContext после создания/редактирования ASP.NET MVC EF 6.1
Если я вернусь к представлению «Редактировать», он по-прежнему покажет старые данные. DBContext, похоже, не обновляет данные.
У меня есть базовый контроллер, который содержит DBC-текст, если это имеет значение.
Вот код для просмотра Редактировать в мой контроллер:
public ActionResult FeaturedItemEdit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
using (nfmContext localContext = new nfmContext())
{
List<FeaturedItem> fi = localContext.FeaturedItems.AsNoTracking().ToList();
FeaturedItem featuredItem = fi.Find(x => x.ID.Equals(id));
if (featuredItem == null)
{
return HttpNotFound();
}
return View(featuredItem);
}
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult FeaturedItemEditPost(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
using (nfmContext db = new nfmContext())
{
var item = db.FeaturedItems.Find(id);
if (TryUpdateModel(item, "", new string[] { "ID", "Title", "ImageAlt", "ImagePath", "Link", "Visible", "Content" }))
{
try
{
item.TimeStamp = DateTime.Now;
db.Entry(item).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("FeaturedItems");
}
catch (DataException ex)
{
Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
}
}
return View(item);
}
}
После редактирования будет сделано, он возвращается к Показанные Пункты просмотра, который просто загружает список элементов:
public ActionResult FeaturedItems()
{
using (nfmContext localContext = new nfmContext())
{
return View(localContext.FeaturedItems.OrderBy(x => x.Visible).ThenBy(x => x.Title).AsNoTracking().ToList());
}
}
Ничего особенного. Сначала я подумал, что это вызвано тем, что все звонки были async
, но, изменив его обратно на неасинхронный, это не имело большого значения. Я не размещал код для создания элемента, однако у него такая же проблема.
Я даже украсил свой контроллер [OutputCache(Location = System.Web.UI.OutputCacheLocation.None)]
, чтобы убедиться, что это не проблема кеширования на стороне клиента.
Итак, я делаю что-то неправильно или есть способ заставить DBContext извлекать свежие записи из базы данных?
UPDATE 1: Вот линия, которая инициализирует мой DbContext в базовом контроллере:
<strike>protected nfmContext db = new nfmContext();</strike>
Это больше не используется - см обновления 2
А вот мои настройки контекста:
public class nfmContext : DbContext
{
public nfmContext() : base("connectionStringHere")
{
}
public DbSet<FeaturedItem> FeaturedItems { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
base.OnModelCreating(modelBuilder);
}
}
ОБНОВЛЕНИЕ 2: Я переключил DBC ontect теперь будет локальным для каждого метода. В приведенном выше коде отражены изменения, и я удалил свойство DBContect с базового контроллера.
Это работает, если вы поместили эту строку 'db = new YourContextName()' после изменения? –
Да, это потому, что вы не закрываете свой контекст. См. [Здесь] (http://stackoverflow.com/questions/14449308/entity-framework-returning-old-data). Я рекомендую использовать контейнер IoC, например [Autofac] (http://stackoverflow.com/questions/29560294/ впрыснуть-DbContext-с-autofac). –
Вы должны добавить код, который инициализирует dbcontext, поскольку он играет важную роль в этом вопросе, и я думаю, что проблема будет там. – BennyM