在Entity Framework中更新导航属性

4

我是一名新手,对Entity Framework的深度了解仍有限。我想知道为什么Entity Framework不能保存更改,特别是导航属性,尽管所有其他属性都已更新。

请给一个简单的解释。

这是我的服务类:

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();
    }
}

还有更新类别的操作

public void UpdateCategory(Category category)
{
    using (var Context = new AppDbContext())
    {
        Context.Entry(category).State = System.Data.Entity.EntityState.Modified;
        Context.SaveChanges();
    }
} 

为什么第一个不起作用? 我知道可能是导航属性的状态出了问题。

1
ProductsService 是注册为 Singleton 还是 Scoped?如果它是 Singleton,数据上下文并不适合长时间存在。在多个操作中重复使用它是设计上的错误。此外,我也会对 public ProductsService() 使用 DI。 - Maximilian Ast
我会尝试一下,但为什么标量属性被更新了呢? - Peter Tharwat
1
我将尝试使用Scope,我想知道为什么唯一的复杂类型没有被更新。 - Peter Tharwat
2个回答

0
你可以考虑使用 .add() 而不是 .entry()。 .add() 还会跟踪其他可达实体。
文档可以在这里找到: entity framework

1
谢谢回复,但我正在使用EF 6而不是Core。 - Peter Tharwat

0

由于您在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,而不是本地创建它们,以避免更改跟踪方面的问题。


1
你是一个聪明的人,实际上我用了 DI ,导航属性现在已经更新了,真的非常感谢你,在 StackOverFlow 上帮助我的第一个人,谢谢。 - Peter Tharwat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接