EF4 - Sproc更新数据,但数据不会在EF中更新

时间:2012-03-20 20:21:39

标签: .net entity-framework-4

我正在使用EF4进行网络应用。

99%的时间我使用LINQ to EF进行数据访问,但其中一个调用需要是一个sproc。它看起来像这样:

object[] params = { new SqlParameter("SomeId", someId),
                    new SqlParameter("OtherId", otherId)};
db.Database.ExecuteSqlCommand("dbo.spMySproc @SomeId, @OtherId", parms);
db.SaveChanges();

sproc被触发,数据被更新。但是,当EF的数据没有得到更新时。我了解到这是expected behavior。我还learned在ObjectContext上有一个.Refresh方法,但我的数据库实体对象继承自DbContext而没有这个。

运行此sproc后,有没有办法刷新我的EF4数据库?

2 个答案:

答案 0 :(得分:1)

DbContext的文档说明如下:

“DbContext包装ObjectContext并使用简化和更直观的API公开ObjectContext最常用的功能。只要需要使用DbContext不支持的功能,就可以访问底层的ObjectContext。有关更多信息,请参阅什么不是支持“。

这让我相信你可以做类似的事情:

DbContext.ObjectContext.Refresh(RefreshMode, Obj)

答案 1 :(得分:1)

凯西或多或少是正确的,但你无法以他指示的方式访问它。您已将DbContext强制转换为IObjectContextAdapter,然后您可以从中访问ObjectContext。

var oc = myContext as IObjectContextAdapter;
if (oc != null)    
     oc.ObjectContext.Refresh()

但是,这可能不是解决问题的正确方法。我怀疑你的问题是你在你的应用程序中使用单个DbContext。 DbContext旨在执行单个操作,然后被销毁。您应该为每个操作创建一个新的DbContext,并在完成时将其删除。

using(var db = new MyDbContext()) {
    object[] params = { new SqlParameter("SomeId", someId),  
                new SqlParameter("OtherId", otherId)};  
    db.Database.ExecuteSqlCommand("dbo.spMySproc @SomeId, @OtherId", parms);  
    //db.SaveChanges();  - This is irrelevant
}