作为一个简单的例子,我有用户,产品和客户。用户可以访问某些产品和某些客户。如何保持客户数据隔离
我正在使用edmx文件将我的SQL Server映射到我的代码并使用linq获取数据。一个典型的查询可能是这个样子:
from prod in ctx.Products
join userProduct in ctx.UserProduct
on prod.Id equals userProduct.ProductId
join user in ctx.UserProfile
on userProduct.UserId equals user.Id
where user.UserName == username // <-- username is a method parameter
select new Product
{
Id = prod.Id,
DisplayText = prod.UserFriendlyText
}
每次我需要从我必须加入对访问权限表的数据库中的数据来排除数据的用户没有访问。这意味着如果有人(最终会发生)忘记加入访问表,用户将看到太多。有没有办法来INCLUDE数据,所以如果我忘记访问表什么都没有显示?
我也一直在考虑将不同的客户分成不同的数据库,因为他们的数据永远不会彼此相关,如果我在客户之间泄漏数据,这将是一个小小的灾难。来自同一客户的用户之间泄漏的产品很差,但并不重要。
如果它很重要我在C#MVC4 CQRS体系结构中最终读写一致性。
我检查堆栈溢出类似的问题,但所有我能找到的是这个没有答案之一:
我想一个简单的存储库模式,如方法,接受用户名作为参数,并且只返回在'IQueryable'中有权访问的产品可以工作,但它仍然像我一样错误地可以查询产品而不加入访问权限表。 –
然后让你的开发者不能直接查询产品。例如,仅为您的模块和数据库API提供Repository接口(然后在运行时使用依赖注入来提供实际的Repository服务)。 –