从实体框架中的表值函数创建集合

时间:2013-08-12 20:00:44

标签: c# entity-framework entity-framework-5 wcf-data-services

我有一个包含非常大的表的数据库(其中一些可能有超过1,000,000条记录),并且该数据库的每个用户都应该看到一些这样的数据,因此我们有多个获得用户ID的TVF(表值函数)并选择该用户可见的表的记录(此操作需要多个SELECT语句,我认为调用TVF远比在代码中实现它好得多。 在我的客户端的程序的第一个版本中,我有一个类具有类型IQueryable的多个属性,使用LinqToSql实现,它工作得很好。 现在我有一个客户端想要使用我的程序集来编写WCF数据服务,所以我必须编写一个派生自DbContext(使用EF)的类,可以在指定的服务中使用。 我的问题是:

  • DbContext会自动公开其中定义的所有DbSet属性,因此每个访问级别最低的用户都可以看到该表的整个数据(当然客户端应用会限制数据,但是客户端可以直接访问数据,甚至可以使用OData将这些数据导入Excel或Access

  • 我有多个IQueryable类型的公共属性,但它们不会出现在WCF数据服务公开的数据列表中。

为了解决这个问题,我认为最完整的解决方案是能够将TVF称为表并从中创建一个集合。但我不知道该怎么做?!

注意   对数据库的任何更改都需要一些日志记录,因此我有存储过程来执行这些更改,因此我只需要对我的WCF数据服务的只读访问权限,并且我不希望默认集包含服务中发布的表的所有记录

3 个答案:

答案 0 :(得分:2)

我认为您可以使用customized data service provider来定义WCF服务的形状,从而获得所需的功能。这可能会变得相当复杂,但由于你已经有了很多IQueryables,你可能会使用Reflection Provider,文档说的是:

  

反射提供程序在返回实现IQueryable接口的类型的类中公开数据。 WCF数据服务使用反射来推断这些类的数据模型,并且可以将针对资源的基于地址的查询转换为针对暴露的IQueryable类型的基于语言集成查询(LINQ)的查询。

该文档链接到使用Reflection Provider的“How to”。基本上,您只需创建一个具有IQueryable属性的伪上下文类,向数据对象添加一些属性,并将您的DataService指向伪上下文类型。 (如果您使用的是Database / Model-first EF,则可能需要创建实体的部分内容以添加属性或更新T4模板。)

答案 1 :(得分:0)

为什么不创建一个以UserID作为参数的记录集返回参数化存储过程(SP)?实体框架可以使用它。

您可以在SP中呼叫您的TVF,或者只是音译SP中的TVF内容。

如果您需要添加/删除/更新功能,如果您的查询不可更新,则可能还需要这些功能的SP。

答案 2 :(得分:0)

DbContext会自动公开其中定义的所有DbSet属性

我建议您在数据库中创建视图或使用Linq2Sql模板。

  
      
  1. 如果您进行视图,模型设计师会制作正确的DataTable。
  2.   
  3. 如果使用linq2sql模板,则可以创建仅具有的数据模型   您想要向其他人展示的属性。
      (在删除linq2sql上的connectioninfomation并使用connctionString分配之后,它就是   怎么用。)
  4.   

我有多个类型为IQueryable的公共属性,但它们不会出现在WCF数据服务公开的数据列表中。

制作模型并使用linq和方法ExcuteJsonAll。
如果有人收到JSON文件,有人会将其提供。

  

如何使模型成为存储过程。

     
      
  1. 在数据库中选择SP。

  2.   
  3. 从数据库更新您的模型

         

    在这里,你带来了SP。

  4.   
  5. 在edmx或模型视图中,您使用SP创建函数。

  6.   
  7. 在创建函数期间,您可以使与DataSet相关的返回值为sp。

  8.