首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架中的更新导航属性

实体框架中的更新导航属性
EN

Stack Overflow用户
提问于 2019-09-04 08:52:50
回答 2查看 1.4K关注 0票数 4

我是实体框架的新成员,我只是想知道为什么实体框架不保存更改,特别是导航属性,尽管所有其他属性都已经更新了--请简单解释一下

这是我的服务课

代码语言:javascript
复制
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();
    }
}

主计长:

代码语言:javascript
复制
[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");
}

我试过了,效果很好

代码语言:javascript
复制
[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

代码语言:javascript
复制
public void UpdateCategory(Category category)
{
    using (var Context = new AppDbContext())
    {
        Context.Entry(category).State = System.Data.Entity.EntityState.Modified;
        Context.SaveChanges();
    }
} 

为什么第一个不能工作,我知道可能是导航属性状态的问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-04 09:10:14

由于您在DbContext中创建了ProductService,并且在其中创建了一个新的上下文:

代码语言:javascript
复制
public void UpdateCategory(Category category) 
{ 
    using (var Context = new AppDbContext()) 
    { 
        Context.Entry(category).State = System.Data.Entity.EntityState.Modified; 
        Context.SaveChanges(); 
    }
}

-> --您可以将两个不同的DbContext放在一起(这会导致更改跟踪问题)!

解决方案:尝试对所有DbContext使用DependencyInjection,而不是在本地创建它们,以防止更改跟踪出现问题。

票数 0
EN

Stack Overflow用户

发布于 2019-09-04 09:04:22

您可以考虑使用.add()而不是.entry()。.add()还将跟踪其他可到达的实体。

文档可以在这里找到:实体框架

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57784850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档