Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将DbContext与Linq一起使用时执行_C#_Linq_Entity Framework_Multi Tenant_Dbcontext - Fatal编程技术网

C# 将DbContext与Linq一起使用时执行

C# 将DbContext与Linq一起使用时执行,c#,linq,entity-framework,multi-tenant,dbcontext,C#,Linq,Entity Framework,Multi Tenant,Dbcontext,我正在设计一个多租户数据库,其中每个租户都有一个对应的数据库用户。用户被分配了对与租户关联的模式的访问权限,以及对dbo模式中的对象的特定权限 识别租户后,我希望通过执行如下SQL语句切换到适当的用户上下文: EXECUTE AS User = 'Tenant1' WITH NO REVERT 当我使用DbContext数据库属性的ExecuteSqlCommand执行此命令时,一切似乎都正常工作。当我稍后使用Linq对模型进行更改并调用该方法时 myDbContext.SaveChanges

我正在设计一个多租户数据库,其中每个租户都有一个对应的数据库用户。用户被分配了对与租户关联的模式的访问权限,以及对dbo模式中的对象的特定权限

识别租户后,我希望通过执行如下SQL语句切换到适当的用户上下文:

EXECUTE AS User = 'Tenant1' WITH NO REVERT
当我使用DbContext数据库属性的ExecuteSqlCommand执行此命令时,一切似乎都正常工作。当我稍后使用Linq对模型进行更改并调用该方法时

myDbContext.SaveChanges();
我有一系列的例外情况:

在提供程序上启动事务时出错 连接。有关详细信息,请参见内部异常

内部例外情况如下:

当前命令发生严重错误。如果有结果的话, 应该放弃


可以用这种方式更改用户的执行上下文吗?如果可以,最好的方法是什么?

您是否尝试过myDbContext.Submit()或SubmitAll?我记不清了,但应该是这样的…

我需要的大部分答案都在这里找到:

然而,这绕过了实际使用数据库用户。我仍在研究如何使用数据库用户的上下文,而不仅仅是指定模式名


更新:

我终于解决了这里的最后一个障碍。关键是以下代码:

if( !string.IsNullOrEmpty( tenantSchema ) && !tenantSchema.Equals( "dbo", StringComparison.OrdinalIgnoreCase ) )
  {
    var objectContext = ( (IObjectContextAdapter)context ).ObjectContext;
    objectContext.Connection.Open();
    var currentUser = objectContext.ExecuteStoreQuery<UserContext>( "SELECT CURRENT_USER AS Name", null ).FirstOrDefault();
    if( currentUser.Name.Equals( tenantSchema, StringComparison.OrdinalIgnoreCase ) )
    {
      var executeAs = string.Format( "REVERT; EXECUTE AS User = '{0}';", tenantSchema );
      objectContext.ExecuteStoreCommand( executeAs );
    }
  }

DbContext类中没有以Submit开头的方法。
SubmitChanges
来自
LinqToSql
。它几乎与
linqtoenties
using (var db = MyDBContext.Create( schemaName, dbConn ))
{
  // ...
}
if( !string.IsNullOrEmpty( tenantSchema ) && !tenantSchema.Equals( "dbo", StringComparison.OrdinalIgnoreCase ) )
  {
    var objectContext = ( (IObjectContextAdapter)context ).ObjectContext;
    objectContext.Connection.Open();
    var currentUser = objectContext.ExecuteStoreQuery<UserContext>( "SELECT CURRENT_USER AS Name", null ).FirstOrDefault();
    if( currentUser.Name.Equals( tenantSchema, StringComparison.OrdinalIgnoreCase ) )
    {
      var executeAs = string.Format( "REVERT; EXECUTE AS User = '{0}';", tenantSchema );
      objectContext.ExecuteStoreCommand( executeAs );
    }
  }
private class UserContext
{
  public string Name { get; set; }
}