我想将 TenantId 添加到 Asp.Net 身份表(例如:用户)。
以下代码段工作正常。租户上下文将通过 DI 注入,租户根据 http 上下文域进行更改:
private readonly ITenantContext<ApplicationTenant> tenantContext;
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options, ITenantContext<ApplicationTenant> tenantContext) : base(options)
{
this.tenantContext = tenantContext;
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<ApplicationUser>(b =>
{
// add tenant
b.Property(typeof(int), "TenantId");
b.HasQueryFilter(x => EF.Property<int>(x, "TenantId") == this.tenantContext.Tenant.Id);
});
}
为了重用,我想为 entityBuilder 创建一个扩展方法:
public static class EntityTypeBuilderExtensions
{
public static void AddTenancy<TEntity>(
this EntityTypeBuilder<TEntity> builder,
Expression<Func<int>> tenantId,
string propertyName = "TenantId")
where TEntity : class
{
// validate
Ensure.Argument.NotNull("builder", builder);
// add property to entity
builder.Property(typeof(int), propertyName).IsRequired();
/* THIS WORKS BUT WILL BE EVALUATED LOCALLY */
// left
var parameterExp = Expression.Parameter(typeof(TEntity), "x"); // e = TEntity => e.g: User
var propertyNameExp = Expression.Constant(propertyName, typeof(string)); // the name of the tenant column - eg.: TenantId
}
}
扩展方法也可以正常工作,但表达式是在本地评估的:-(。有人可以帮我修复它吗?
LINQ 表达式 'where (Property([x], "TenantId") == Invoke(__ef_filter__tenantId_0))' 无法翻译,将在本地进行评估。无法翻译 LINQ 表达式“where ([x].NormalizedUserName == __normalizedUserName_0)”并将在本地进行评估。无法翻译 LINQ 表达式“FirstOrDefault()”并将在本地进行评估。
倚天杖
相关分类