Aida-Hagh / EF-Core

Learn EF Core
1 stars 0 forks source link

Global Query Filters - Example2 #22

Open Aida-Hagh opened 4 months ago

Aida-Hagh commented 4 months ago

مثال 2: چندمستاجری (Multi-Tenancy) فرض کنید شما یک سیستم مدیریت منابع دارید که برای چند شرکت مختلف (مستاجر) استفاده می‌شود و می‌خواهید مطمئن شوید که هر شرکت فقط به داده‌های خود دسترسی دارد.

public class Resource {

public int ResourceId { get; set; }
public string ResourceName { get; set; }
public int TenantId { get; set; }

}

public class ApplicationDbContext : DbContext {

private readonly int _currentTenantId;

public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options, int currentTenantId)
    : base(options)
{
    _currentTenantId = currentTenantId;
}

public DbSet<Resource> Resources { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<Resource>().HasQueryFilter(r => r.TenantId == _currentTenantId);
}

}


class Program {

static void Main()
{
    var options = new DbContextOptionsBuilder<ApplicationDbContext>()
        .UseInMemoryDatabase(databaseName: "TestDatabase")
        .Options;

    int currentTenantId = 1; // شناسه مستاجر فعلی

    using (var context = new ApplicationDbContext(options, currentTenantId))
    {
        // افزودن منابع
        context.Resources.AddRange(
            new Resource { ResourceName = "Resource1", TenantId = 1 },
            new Resource { ResourceName = "Resource2", TenantId = 2 }
        );
        context.SaveChanges();

        // اجرای کوئری: فقط منابع مربوط به مستاجر فعلی بازگردانده می‌شوند
        var resources = context.Resources.ToList();

        foreach (var resource in resources)
        {
            Console.WriteLine($"Resource: {resource.ResourceName}");
        }
    }
}

}