DbSet 不包含 SaveChanges 的定义

Posted

技术标签:

【中文标题】DbSet 不包含 SaveChanges 的定义【英文标题】:DbSet does not contain definition for SaveChanges 【发布时间】:2021-07-22 06:20:36 【问题描述】:

我正在尝试删除数据网格中的选定行以及数据库中的同一行。

虽然 dbset 不包含 SaveChanges 的定义,但我收到一个错误。

对于 Linq 和 EF 来说相对较新。有谁知道这可能来自哪里?

private void DeleteButton_Click(object sender, RoutedEventArgs e)

        using (EFContext db = new EFContext())
        
            int proId = (ProductDatagrid.SelectedItem as Product).ProductID;
            Result result = (from r in db.products where r.ProductID == proId select r).SingleOrDefault();
            db.Product.Remove(result);
            db.Product.SaveChanges();

            ProductDatagrid.ItemsSource = db.Results.ToList();
        

【问题讨论】:

我已经有一段时间没有做任何 EF 了,但不应该在 EFContext 对象上调用 SaveChanges(),在这种情况下是 db 查询from r in db.products select r 是否返回Result 对象的集合?我假设您的 db.products 映射到 Product 模型,而不是 Result 模型。 【参考方案1】:

您可以从Remove()SaveChanges() 方法中删除.ProductResult result 将由实体框架跟踪,因此它将知道要从哪个表中删除您的 record,然后您可以调用 db.SaveChanges() 而不会出现任何错误,因为它是在 DbContext (EfContext) 上调用的:

   using (EFContext db = new EFContext())
    
        int proId = (ProductDatagrid.SelectedItem as Product).ProductID;

        Result result = (from r in db.products where r.ProductID == proId select r).SingleOrDefault();

        // .Product removed
        db.Remove(result);
        db.SaveChanges();

        ProductDatagrid.ItemsSource = db.Results.ToList();

    

但如果您想继续使用 db.Product 的语法,那么您也可以将 Result 对象附加到 dbContext 而无需像这样的查询:

   using (EFContext db = new EFContext())
    
        int proId = (ProductDatagrid.SelectedItem as Product).ProductID;

        Result result = new Result  ProductId = proId;

        db.Product.Attach(result);
        db.Product.Remove(result);
        db.Product.SaveChanges();

        ProductDatagrid.ItemsSource = db.Results.ToList();

    

或者您可以将实体状态设置为已删除并以这种方式删除:

   using (EFContext db = new EFContext())
    
        int proId = (ProductDatagrid.SelectedItem as Product).ProductID;

        Result result = new Result  ProdId = proId ;

        db.Entry(result).State = EntityState.Deleted;
        db.SaveChanges();

        ProductDatagrid.ItemsSource = db.Results.ToList();

    

【讨论】:

以上是关于DbSet 不包含 SaveChanges 的定义的主要内容,如果未能解决你的问题,请参考以下文章

实体框架,查询包含上下文更改的dbset,而不调用保存更改

在实体框架中,DbSet.Local 保持不同步

下述哪一条不是由于关系模式设计不当而引起的

SaveChanges无法处理JsonResult方法(UPDATE INFO)

DbContext.set() 无法为实体创建 DbSet,因为此类型未包含在上下文的模型中

无法为“ApplicationUser”创建 DbSet,因为此类型未包含在上下文模型中