C# 更新实体框架中的导航属性
我是实体框架深度的新手 我刚才想知道为什么实体框架不保存更改,特别是导航属性,尽管所有其他属性都已更新 请给我简单的解释 这是我的服务课C# 更新实体框架中的导航属性,c#,entity-framework,entity-framework-6,lazy-loading,C#,Entity Framework,Entity Framework 6,Lazy Loading,我是实体框架深度的新手 我刚才想知道为什么实体框架不保存更改,特别是导航属性,尽管所有其他属性都已更新 请给我简单的解释 这是我的服务课 public class ProductsService { AppDbContext _Context; public ProductsService() { _Context = new AppDbContext(); } public Product GetProduct(int id)
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();
}
}
为什么第一个不起作用
我知道可能是导航属性状态下的问题 ,您可以考虑使用.Ad()代替.Enter()。 .add()还将跟踪其他可访问的实体 文档可在此处找到:
您可以考虑使用.Ad()代替.Enter()。 .add()还将跟踪其他可访问的实体 文档可在此处找到:
既然您在
ProductService
内部创建了DbContext
,并且在内部创建了一个新的上下文:
public void UpdateCategory(Category category)
{
using (var Context = new AppDbContext())
{
Context.Entry(category).State = System.Data.Entity.EntityState.Modified;
Context.SaveChanges();
}
}
->您同时使用两个不同的DbContext
(这可能会导致更改跟踪问题)
解决方案:
尝试对所有
DbContext
使用DependencyInjection,而不是在本地创建它们,以防止更改跟踪出现问题。因为您在ProductService
内部创建了DbContext
,并且在内部创建了新的上下文:
public void UpdateCategory(Category category)
{
using (var Context = new AppDbContext())
{
Context.Entry(category).State = System.Data.Entity.EntityState.Modified;
Context.SaveChanges();
}
}
->您同时使用两个不同的DbContext
(这可能会导致更改跟踪问题)
解决方案:
尝试对所有
DbContext
使用DependencyInjection,而不是在本地创建它们,以防止更改跟踪出现问题。是否将ProductsService
注册为Singleton或范围?如果它是单例的,那么数据上下文就不是设计为长期存在的。在多个操作中重用它是设计中的一个错误。此外,我还将对public products service()
使用DI。mmmmmm,我将尝试它,但为什么标量属性会更新?我将尝试作用域,我想知道为什么唯一的复杂类型不是UpdatedIsproducts service
注册为Singleton或作为作用域?如果它是单例的,那么数据上下文就不是设计为长期存在的。在多个操作中重用它是设计中的一个错误。此外,我还将为公共产品服务()
使用DI。mmmmmm,我会尝试,但为什么标量属性会更新?我会尝试范围,我想知道为什么唯一的复杂类型没有更新谢谢回复,但我使用的是EF 6不是Core谢谢回复,但我使用的是EF 6不是Core你是个聪明人,事实上我使用了DI,导航属性现在更新了,我真的很感谢你,你是StackOverFlow中第一个帮助我的人,谢谢你是个聪明人,事实上我使用了DI,导航属性现在更新了,我真的很感谢你,你是StackOverFlow中第一个帮助我的人,谢谢