EF + UnitOfWork + SharePoint RunWithElevatedPrivileges

Posted

技术标签:

【中文标题】EF + UnitOfWork + SharePoint RunWithElevatedPrivileges【英文标题】: 【发布时间】:2011-11-30 14:30:42 【问题描述】:

在我们的 SharePoint 应用程序中,我们将 UnitOfWork + Repository 模式与实体框架一起使用。为避免使用直通身份验证,我们开发了一段代码,在创建 ObjectContext 实例之前模拟单个用户,其方式与本网站“Impersonating user with Entity Framework”中描述的方式类似。

我们的代码和提到的问题之间的唯一区别是,为了进行模拟,我们使用RunWithElevatedPrivileges 来模拟应用程序池身份,如下例所示。

SPSecurity.RunWithElevatedPrivileges(delegate()  
    using (SPSite site = new SPSite(url)) 
        _context = new MyDataContext(ConfigSingleton.GetInstance().ConnectionString);
    
);

我们这样做是因为我们希望在模拟之后创建ObjectContext,并且由于存储库正在接收模拟的ObjectContext 将解决我们的要求。

不幸的是,这并不容易。事实上,我们体验到,即使ObjectContext 是在模拟情况之前和模拟情况下创建的,但真正的连接是在执行查询之前建立的,因此不使用模拟,这违反了我们的要求。

我检查了ObjectContext 类,看看是否有任何事件可以注入模拟,但不幸的是什么也没找到。

有什么帮助吗?

【问题讨论】:

【参考方案1】:

我们在使用 LinqToSharePoint 时遇到了类似的问题。 DataContext 是从 HttpContext.Current 创建的,没有考虑 RunWithElevatedPrivileges 方法。我们做了一个令人讨厌的解决方法,我们备份了原始的 HttpContext,在 RunWithElevatedPrivileges 方法中创建了一个新的虚拟 HttpContext,问题就消失了。显然我们之后将上下文设置为原始的。

编辑:

您可以使用以下方法创建新的虚拟HttpContext。在您的 RunWithElevatedPrivileges 中首先调用此方法。在正常上下文中,只需使用var backupContext = HttpContext.Current 备份您当前的上下文,然后在一切完成后将上下文设置回来。

private void SetNewContextWeb(SPWeb oWeb)   
 
    HttpRequest httpRequest = new HttpRequest(string.Empty, oWeb.Url, string.Empty); 
    HttpContext.Current = new HttpContext(httpRequest, new HttpResponse(new System.IO.StringWriter()));   
    SPControl.SetContextWeb(HttpContext.Current, oWeb);   

【讨论】:

您能否详细说明您的解决方案?谢谢

以上是关于EF + UnitOfWork + SharePoint RunWithElevatedPrivileges的主要内容,如果未能解决你的问题,请参考以下文章

一步一步学EF系列6IOC 之AutoFac

如何使用通用存储库实现 ADO.NET?

[小技巧]EF Core中如何获取上下文中操作过的实体

AngularJs + WebApi + EF + SqlServer 一步一步搭建项目

带有延迟加载的EF4 POCO。为什么fixup迭代整个数据库?

UnitOfWork 是不是等于事务?还是不止于此?