entity framework 使用存储过程删除数据后,还用再使用SaveChanges()保存吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了entity framework 使用存储过程删除数据后,还用再使用SaveChanges()保存吗?相关的知识,希望对你有一定的参考价值。

entity framework 使用存储过程删除数据后,还用再使用SaveChanges()保存吗?

执行存储过程后是直接执行了SQL语句 但是如果不适用 SaveChanges()保存的话 EF在内存维护的数据会没有改变 如果不注意一下的话 可能会引起读取的是旧数据 也就是读取的是内存中的数据。 EF 有些方法是会先读取内存中维护的数据如果没有才会从数据库中执行SQL语句读取数据库中的数据的。 使用 SaveChanges() 方法是非常重要的 当然最安全的就是执行方法结束后 立即SaveChanges() 但要是操作的方法涉及到多个执行语句 那么就建议全部执行完成后保存 参考技术A 存储过程删除后的数据,会影响数据表真实数据。
EF的SaveChanges本身的作用是持久化,即把EF维护的对象(C、R、U、D)同步到数据库中。
存储过程删除数据后,数据表中的数据肯定会被删除,毋庸置疑,但EF维护的对象未必与数据库一样。
参考技术B 我测试的 entity framework 调用存储过程的时候, 好像是 没有 SaveChanges() 。 但是数据还是更新了。 参考技术C 实验证明不需要!!

Entity Framework 6 中具有多个记录集的存储过程

【中文标题】Entity Framework 6 中具有多个记录集的存储过程【英文标题】:Stored procedure with multiple recordsets in Entity Framework 6 【发布时间】:2021-12-23 09:35:09 【问题描述】:

ASP.NET Core 6 Web API、EF 6、C#、SQL Server 2019。我知道如何执行返回记录集的存储过程,利用模型映射,并获取填充的强类型对象集合对应记录。生活如此美好。

有没有办法执行返回多个记录集并接收强类型记录对象集合的存储过程?

我知道如何做到这一点没有实体框架(例如,旧学校 SqlDataAdapter / Dataset,或通过 DataReader 手动解析记录)。

也许有一种方法可以以某种方式将记录集解析逻辑与 EF 中的查询执行逻辑分离,手动执行后者,然后从一系列 DataReader 中填充记录集合?

【问题讨论】:

【参考方案1】:

如果您只需要将查询结果映射到您不需要的对象,则需要像 EF Core 6 这样的全功能 ORM。您可以使用像 Dapper 这样的微 ORM 来映射查询结果直接指向对象。

在最常见的情况下,您可以将查询的结果映射到对象,甚至可以使用以下参数:

var sql="select * from Products where CategoryId=@category";
var products=connection.Query<Product>(sql,new category=123);

您还可以映射多个结果:

var sql =
@"
select * from Customers where CustomerId = @id
select * from Orders where CustomerId = @id
select * from Returns where CustomerId = @id";

using (var multi = connection.QueryMultiple(sql, new id=selectedId))

   var customer = multi.Read<Customer>().Single();
   var orders = multi.Read<Order>().ToList();
   var returns = multi.Read<Return>().ToList();
   ...

【讨论】:

以上是关于entity framework 使用存储过程删除数据后,还用再使用SaveChanges()保存吗?的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework 6 Recipes 2nd Edition(10-10)译 - > 为TPH继承的插入更新删除操作映射到存储过程

使用带有 C# 的 Entity Framework 6 调用现有的存储过程

在entity framework中怎么调用存储过程

如何在 Entity Framework Core 中运行存储过程?

如何在 Entity Framework Core 中运行存储过程?

使用 .NET ORM 工具(如 Entity Framework、LinqToSql)而不是存储过程的好处