Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更新实体框架中的导航属性_C#_Entity Framework_Entity Framework 6_Lazy Loading - Fatal编程技术网

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,我将尝试它,但为什么标量属性会更新?我将尝试作用域,我想知道为什么唯一的复杂类型不是UpdatedIs
products service
注册为Singleton或作为作用域?如果它是单例的,那么数据上下文就不是设计为长期存在的。在多个操作中重用它是设计中的一个错误。此外,我还将为
公共产品服务()
使用DI。mmmmmm,我会尝试,但为什么标量属性会更新?我会尝试范围,我想知道为什么唯一的复杂类型没有更新谢谢回复,但我使用的是EF 6不是Core谢谢回复,但我使用的是EF 6不是Core你是个聪明人,事实上我使用了DI,导航属性现在更新了,我真的很感谢你,你是StackOverFlow中第一个帮助我的人,谢谢你是个聪明人,事实上我使用了DI,导航属性现在更新了,我真的很感谢你,你是StackOverFlow中第一个帮助我的人,谢谢