有许多examples显示了在使用Entity Framework时如何使用ObjectContext
从多结果集存储过程中获取结果。
这些示例始终使用DbContext
,将其转换为IObjectContextAdapter
,并获得ObjectContext
,即使他们在几行中做了同样的事情。
来自MSDN的示例(删除原始评论以简化和突出显示我的评论):
using (var db = new BloggingContext())
{
db.Database.Initialize(force: false);
var cmd = db.Database.Connection.CreateCommand();
cmd.CommandText = "[dbo].[GetAllBlogsAndPosts]";
try
{
db.Database.Connection.Open();
var reader = cmd.ExecuteReader();
var blogs = ((IObjectContextAdapter)db)
.ObjectContext //First Time
.Translate<Blog>(reader, "Blogs", MergeOption.AppendOnly);
foreach (var item in blogs)
{
Console.WriteLine(item.Name);
}
reader.NextResult();
var posts = ((IObjectContextAdapter)db)
.ObjectContext //Second Time
.Translate<Post>(reader, "Posts", MergeOption.AppendOnly);
foreach (var item in posts)
{
Console.WriteLine(item.Title);
}
}
finally
{
db.Database.Connection.Close();
}
}
我的存储过程返回了许多结果集,因此我希望通过将ObjectContext
的引用复制到本地变量来尽可能地简化代码,但我不确定这样做是否会导致问题。
我找到了一个article,表示&#34;概念性地&#39; DbContext&#39;与&#39; ObjectContext&#39;相同。&#34;
我没有找到任何明确指出对象实例的范围和生命周期的内容
ObjectContext
的文档有点缺乏细节。
我更喜欢支持任何答案的官方文档的链接。
答案 0 :(得分:0)
DbContext
是ObjectContext
的包装器。因此它包含一个ObjectContext
实例,您可以通过IObjectContextAdapter
接口访问该实例。 IObjectContextAdapter.ObjectContext
将始终返回相同的实例。
如果你想绝对确定,只需检查
的输出Console.WriteLine(((IObjectContextAdapter)db).ObjectContext.GetHashCode());
Console.WriteLine(((IObjectContextAdapter)db).ObjectContext.GetHashCode());
它将显示两次相同的值。