Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 多租户体系结构的实体框架-按租户ID筛选单个表_Asp.net_Entity Framework_Multi Tenant - Fatal编程技术网

Asp.net 多租户体系结构的实体框架-按租户ID筛选单个表

Asp.net 多租户体系结构的实体框架-按租户ID筛选单个表,asp.net,entity-framework,multi-tenant,Asp.net,Entity Framework,Multi Tenant,我们正在寻找一种在实体框架中通过租户ID自动过滤所有CRUD操作的方法 我们想到的想法是: 使用表值用户定义函数 使用存储过程(但我们并不想这样做,因为我们使用ORM来避免这样做) 介绍了如何修改用于生成SQL的模板,以便在每条语句上添加where子句 如何修改用于在控制器中生成LINQ的模板(我们可以使用MVC) 有什么建议吗 -谢谢 亚历克斯 使用表值用户定义函数 表值函数仅在.NET 4.5 Beta版中可用(在代码优先版中不可用)。使用它们仍然对您没有帮助,因为您必须在每个LINQ查

我们正在寻找一种在实体框架中通过租户ID自动过滤所有CRUD操作的方法

我们想到的想法是:

  • 使用表值用户定义函数
  • 使用存储过程(但我们并不想这样做,因为我们使用ORM来避免这样做)
  • 介绍了如何修改用于生成SQL的模板,以便在每条语句上添加where子句
  • 如何修改用于在控制器中生成LINQ的模板(我们可以使用MVC)
有什么建议吗

-谢谢 亚历克斯

使用表值用户定义函数

表值函数仅在.NET 4.5 Beta版中可用(在代码优先版中不可用)。使用它们仍然对您没有帮助,因为您必须在每个LINQ查询中使用该函数,因此它与使用where子句相同

使用存储过程(但我们并不想这样做,因为我们使用ORM来避免这样做)

对于某些特殊的复杂查询,它可能很有用,但通常不是您想要的

介绍了如何修改用于生成SQL的模板,以便在每条语句上添加where子句

太复杂,抽象层次完全不同

如何修改用于在控制器中生成LINQ的模板(我们可以使用MVC)

接近理想溶液。您只需将对实体集的访问权包装成如下代码:

public class MultiTenantAccess<T> where T : IMultitenant
{
    private IDbSet<T> set;  

    ... 

    public IQueryable<T> GetQuery(int tenantID) 
    {
        return set.Where(e => e.TenantID == tenantID); 
    }
}
公共类多租户访问,其中T:IMultitenant
{
私有IDB集;
... 
公共IQueryable GetQuery(int-tenantID)
{
返回集合。其中(e=>e.TenantID==TenantID);
}
}

有时,这是所谓的通用存储库的核心,但它实际上只是EF集的包装器。您将始终使用
GetQuery
来查询数据存储,而不是直接使用
DbSet

您也可以将租户数据分离到不同的数据库中

或者使用相同的数据库,但使用不同的模式?您可以在一篇名为“

Hi@Ladislav”的旧MSDN文章中阅读更多关于这一点的信息。我很难想象IMultitenant应该包含什么内容,您是否有空闲时间可以详细说明一下?谢谢:-)实际上我只是在想,我想IMultitenant会包含TenantId吗?我说的对吗?是的,它必须定义
TenantId
,您的实体必须实现该接口。谢谢@Ladislav,我想我已经让它工作了。我想我需要仔细阅读一下寄存模式。再次感谢你的帮助。嗨@Ladislav,再次感谢你的回答。我正在做一些测试实现,它工作得很好。但我想知道你是否对任何可能的替代方案有任何想法。我们希望使用动态数据生成一些后端管理页面,这些页面最适合EntityDataSource。我一直在绞尽脑汁,但想不出一种方法——有没有替代常规回购模式的方法来注入某种过滤器——或许可以覆盖dbset?但我似乎什么都做不到。谢谢奥克曼,是的,我以前读过这篇文章,这是一篇好文章。当时只有一个共享的db共享模式适合我们,但这是一个值得从我这里列出这个问题+1的链接。这个链接被破坏了。你知道最新的网址吗?我在[PDF和MSDN链接已断开。有关于最新URL的帮助吗?这现在可以在EF Core中使用全局查询过滤器实现:非常好的提示!我现在身处一个不同的世界,但这在构建该系统时会非常有用!对于这个问题的未来观众,我确实使用存储库模式inspir成功地实现了该系统通过Ladislav的回答,但我现在会认真考虑全局查询过滤方法……但是,特别是我没有做EF工作了几年了。