运行修改实体的存储过程后,我的 DbContext 会发生啥情况?

Posted

技术标签:

【中文标题】运行修改实体的存储过程后,我的 DbContext 会发生啥情况?【英文标题】:What happens to my DbContext after I run a stored procedure that modifies my entities?运行修改实体的存储过程后,我的 DbContext 会发生什么情况? 【发布时间】:2014-03-08 06:14:14 【问题描述】:

场景: 我有一个自定义DbContext。我正在使用底层ObjectContextStoreConnection 属性来运行修改多个实体的存储过程(在我的自定义DbContext 中有一个DbSet)。我的 DbContext 和存储库由 Unity v3 提供。

示例

private MyContext _ctx;
private IGenericRepository<Foo>();
private IGenericRepository<Bar>();

public void DoSomethingFooAndBar()

    var connection = _ctx.StoreConnection; //Exposed ObjectContext.StoreConnection in my custom context
    using (var cmd = connection.CreateCommand())
    
        command.CommandText = "dbo.ModifyFooAndBar";
        command.CommandType = CommandType.StoredProcedure;
        command.ExecuteNonQuery();
    
    //What is the state of my DbSet<Foo> and DbSet<Bar>?

问题: 在这个存储过程之后我是否会冒着DbContext 过时的风险,如果是这样,我如何让它成为当前的,而不是处理它并创建一个新的?

【问题讨论】:

【参考方案1】:

如果您在运行存储过程后继续使用 DbContext,此时 DbContext 将过时。根据这个答案 (https://***.com/a/18830466/3294324),您也许可以在不创建新上下文的情况下更新您的上下文。

你可以试试这样的:

var Context = ((IObjectContextAdapter)_ctx).ObjectContext;
Context.Refresh(RefreshMode.StoreWins, Context.ObjectStateManager.GetObjectStateEntries());

【讨论】:

以上是关于运行修改实体的存储过程后,我的 DbContext 会发生啥情况?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 dbcontext SaveChanges 将修改后的记录推送到数据库?

如何在具有存储库模式的实体框架中伪造 DbContext.Entry 方法

实体框架数据集映射

与实体相比,另一层中的 DbContext

C# 实体框架 DBContext

如何刷新实体框架核心 DBContext?