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()
方法中删除.Product
。 Result 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 的定义的主要内容,如果未能解决你的问题,请参考以下文章
SaveChanges无法处理JsonResult方法(UPDATE INFO)