我有一个多租户应用程序,如何在Entity Framework 7中使用拦截?
在Entity Framework 6中,使用System.Data.Entity.Infrastructure.Interception存在拦截,但在实体框架的版本7中找不到。
这是一个例子 - > https://azure.microsoft.com/en-us/documentation/articles/web-sites-dotnet-entity-framework-row-level-security/
答案 0 :(得分:1)
拦截尚未在EFCore中实施。这是一个积压项目(见https://github.com/aspnet/EntityFramework/wiki/Roadmap)
答案 1 :(得分:0)
虽然EF Core没有拦截器,但可以执行QueryFilters以确保所有查询都按租户ID进行过滤。
Gunnar Peipman有很多文章可以帮助您了解如何将QueryFilters用于多租户方案。 http://gunnarpeipman.com/2017/08/ef-core-global-query-filters/
答案 2 :(得分:0)
我有些问题。 在EF Core中,您可以使用拦截器,这里有一些可能有用的示例代码:
using System.Data.Common;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Microsoft.Extensions.DiagnosticAdapter;
public class CommandListener
{
[DiagnosticName("Microsoft.EntityFrameworkCore.Database.Command.CommandExecuting")]
public void OnCommandExecuting(DbCommand command, DbCommandMethod executeMethod, Guid commandId, Guid connectionId, bool async, DateTimeOffset startTime)
{
//call security or other methods here.
}
[DiagnosticName("Microsoft.EntityFrameworkCore.Database.Command.CommandExecuted")]
public void OnCommandExecuted(object result, bool async)
{
//call security or other methods here.
}
}
在您的存储库的构造函数中,您可以执行挂钩
var listener = _context.GetService<DiagnosticSource>();
(listener as DiagnosticListener).SubscribeWithAdapter(new CommandListener());
现在,当您查询dbContext时,例如:
_context.employees.Where(...
然后在返回此查询之前,执行上述方法OnCommandExecuting和OnCommandExecuted。
所以你可以在某种程度上模仿EF Core中的SaveChanges覆盖。
但是需要注意的一件重要事情是,在OnCommandExecuting和OnCommandExecuted方法中无法访问查询的返回结果集。