【发布时间】:2013-08-12 20:00:44
【问题描述】:
我有一个包含非常大表的数据库(其中一些可能有超过 1,000,000 条记录),并且该数据库的每个用户都应该看到其中的一些数据,因此我们有多个 TVF(表值函数)来获取用户 ID并选择该用户可见的表记录(此操作需要多个SELECT 语句,我认为调用 TVF 比在代码中实现它要好得多)。
在向我的客户发布该程序的第一个版本中,我有一个具有多个 IQueryable 类型属性的类,它使用 LinqToSql 实现并且效果很好。
现在我有一个客户想要使用我的程序集来编写 WCF 数据服务,所以我必须编写一个派生自 DbContext(使用 EF) 的类,该类可以在指定的服务中使用。
我的问题是:
DbContext自动暴露其中定义的所有DbSet属性,因此每个具有最低访问级别的用户都可以看到表的整个数据(当然客户端应用程序会限制数据,但客户端可以访问数据直接,甚至使用 OData 将这些数据导入 Excel 或 Access)我有多个
IQueryable类型的公共属性,但它们不会出现在 WCF 数据服务公开的数据列表中。
为了解决这个问题,我认为最完整的解决方案是能够将 TVF 作为一个表来调用,并从中创建一个集合。但我不知道该怎么做?!
注意 对数据库的任何更改都需要一些日志记录,因此我有存储过程来执行这些更改,因此我只需要对我的 WCF 数据服务的只读访问权限,并且我不希望包含在服务中发布的表的所有记录的默认集
【问题讨论】:
-
我不确定,但我认为您可以使用 Select 语句,就像您要从表中选择来填充数据集一样。
-
@Malachi 感谢您的回答,但我可以(实际上我已经这样做)从我的 TVF 获取 IQueryable,但问题是 WCF 数据服务仅显示我的 DbContext 的所有 DbSet 属性,我想要隐藏所有这些属性并显示我的 IQueryable 属性,但我不知道如何!
-
你不能创建一个服务类来限制对你的 TVF 的访问吗?
标签: c# entity-framework entity-framework-5 wcf-data-services