Asp.net 多租户体系结构的实体框架-按租户ID筛选单个表
我们正在寻找一种在实体框架中通过租户ID自动过滤所有CRUD操作的方法 我们想到的想法是: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查
- 使用表值用户定义函数
- 使用存储过程(但我们并不想这样做,因为我们使用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工作了几年了。