【问题标题】:.Net - Linq to SQL - Row Level Tenancy.Net - Linq to SQL - 行级租赁
【发布时间】:2020-04-18 04:38:55
【问题描述】:

我们有行级多租户数据库。以前的应用程序是使用带有 DataContext 类的 EF 开发的,我们设法创建该类的范围以在全局级别进行过滤,如

public EFDbContext(int tenantID = 0) : base("name=WMSEntities")    //Constructor of the class always expect a tenantID
{
     //tenantID = int.Parse(System.Security.Claims.ClaimsPrincipal.Current.FindFirst("tenantid").Value);
     //Here, the Dbset can expose the unfiltered data            
     Tenants = new FilteredDbSet<Tenant>(this);
     //From here, add all the multitenant dbsets with filtered data
     Items = new FilteredDbSet<Item>(this, d => d.TenantID == tenantID);
}

但是这个特定的应用程序正在使用 DBML、LINQ to SQL,其中继承的 DbContext 类不起作用。这里的大多数示例都是基于 EF 而不是 LINQ To SQL。

了解如何使用 LINQ To SQL 来实现这一点,或者我最好更改这个 EF?

【问题讨论】:

  • 迁移到 EF 总是更好。 LINQ to SQL 是一条死胡同。

标签: c# asp.net-mvc entity-framework linq


【解决方案1】:

一种从 LINQ 生成 SQL 语句的方法,您需要传入 IQueryable&lt;Tuple&lt;T, int&gt;&gt; 这样 LINQ to SQL 知道如何将其转换为 SQL:

我会用这个替换你的基类和存储库。

// Repository/Generic base class
using System;
using System.Collections;
using System.Linq;

public  IQueryable<T> TenantFilteredContext(
IQueryable<Tuple<T, int>> TenantModelRelationIds, string objectType)
{
var tenantObjects =
    from tenantRelationRecord in objectTenantRelationRepo.All()
    where tenantRelationRecord.TenantId == Global.TenantId
    where tenantRelationRecord.ObjectTypeId == type.TypeId
    select tenantObjectRecord;

var result =
    from item in this.context.GetTable<T>()
    join objectToTenentRelationId in TenantModelRelationIds
        on objectToTenentRelationId.Item1 equals item
    join tenantObject in tenantObjects
        on TenantModelRelationIds.Item2 equals tenantObject.ObjectId
    select item;

return result;

}


您可以测试here,只需更新您的变量并返回对象。我不得不从我的示例中删除一些代码

【讨论】:

  • 我认为你没有测试过这个。
  • 我放了一个链接,你测试它并用你的变量更新
  • 对不起,小提琴不可能运行。不确定您要在这里做什么,但 join 甚至无法编译。 on objectToTenentRelationId.Item1 equals item 是范围变量的错误顺序。内存列表中的对象怎么可能等于 LIQ-to-SQL 表中新创建的对象呢?更不用说 LINQ-to-SQL 不允许加入本地序列这一事实。
  • 在小提琴中他需要替换 DbContext 和租户变量。现在,如果您回来阅读他的问题,他正在 寻求指针 关于如何执行 Linq to Sql 欣赏关于如何使用 LINQ To SQL 实现这一点的指针 。代码示例不完整,但向他展示了他可以通过提供带有 Tuple 或 Func * 的 IQueryable> 来绕过传递对象的障碍。
  • 无法使用 LINQ-to-SQL 运行且包含语法错误的代码是指向错误方向的指针。
猜你喜欢
  • 1970-01-01
  • 2016-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多