我是实体框架的新成员,我只是想知道为什么实体框架不保存更改,特别是导航属性,尽管所有其他属性都已经更新了--请简单解释一下
这是我的服务课
public class ProductsService
{
AppDbContext _Context;
public ProductsService()
{
_Context = new AppDbContext();
}
public Product GetProduct(int id)
{
return _Context.Products.Include(p=>p.Category).Where(pro =>pro.Id == id).SingleOrDefault();
}
public void UpdateProduct(Product product)
{
_Context.Entry(product).State = System.Data.Entity.EntityState.Modified;
_Context.SaveChanges();
}
}主计长:
[HttpPost]
public ActionResult Edit(NewCategoryViewModel pro,int Id)
{
CategoriesService ser = new CategoriesService();
var NewProduct = ProService.GetProduct(Id);
var NewCat = ser.GetCategory(pro.CategoryId);
NewProduct.Description = pro.Description;
NewProduct.Name = pro.Name;
NewProduct.Price = pro.Price;
NewProduct.Category = NewCat;
ProService.UpdateCategory(NewProduct);
return RedirectToAction("ProductTable");
}我试过了,效果很好
[HttpPost]
public ActionResult Edit(NewCategoryViewModel pro,int Id)
{
using (var Context = new AppDbContext())
{
var NewProd = Context.Products.FirstOrDefault(pr => pr.Id == Id);
var Cat = Context.Categories.FirstOrDefault(cat => cat.Id == pro.CategoryId);
Context.Entry(NewProd).State = EntityState.Modified;
NewProd.Name = pro.Name;
NewProd.Description = pro.Description;
NewProd.Price = pro.Price;
NewProd.Category = Cat;
Context.SaveChanges();
}
}对于UpdateCategory
public void UpdateCategory(Category category)
{
using (var Context = new AppDbContext())
{
Context.Entry(category).State = System.Data.Entity.EntityState.Modified;
Context.SaveChanges();
}
} 为什么第一个不能工作,我知道可能是导航属性状态的问题。
发布于 2019-09-04 09:10:14
由于您在DbContext中创建了ProductService,并且在其中创建了一个新的上下文:
public void UpdateCategory(Category category)
{
using (var Context = new AppDbContext())
{
Context.Entry(category).State = System.Data.Entity.EntityState.Modified;
Context.SaveChanges();
}
}-> --您可以将两个不同的DbContext放在一起(这会导致更改跟踪问题)!
解决方案:尝试对所有DbContext使用DependencyInjection,而不是在本地创建它们,以防止更改跟踪出现问题。
发布于 2019-09-04 09:04:22
您可以考虑使用.add()而不是.entry()。.add()还将跟踪其他可到达的实体。
文档可以在这里找到:实体框架
https://stackoverflow.com/questions/57784850
复制相似问题