C# 将DbContext与Linq一起使用时执行
我正在设计一个多租户数据库,其中每个租户都有一个对应的数据库用户。用户被分配了对与租户关联的模式的访问权限,以及对dbo模式中的对象的特定权限 识别租户后,我希望通过执行如下SQL语句切换到适当的用户上下文: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
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; }
}