ObjectContext是否会针对每个结果集进行更改?

时间:2016-05-04 19:17:57

标签: c# entity-framework-6

有许多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的文档有点缺乏细节。

我更喜欢支持任何答案的官方文档的链接。

1 个答案:

答案 0 :(得分:0)

DbContextObjectContext的包装器。因此它包含一个ObjectContext实例,您可以通过IObjectContextAdapter接口访问该实例。 IObjectContextAdapter.ObjectContext将始终返回相同的实例。

如果你想绝对确定,只需检查

的输出
Console.WriteLine(((IObjectContextAdapter)db).ObjectContext.GetHashCode());
Console.WriteLine(((IObjectContextAdapter)db).ObjectContext.GetHashCode());

它将显示两次相同的值。