我正在使用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数据库?
答案 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
}