2+上的OData;小田饲料

2+上的OData;小田饲料,odata,wcf-data-services,Odata,Wcf Data Services,假设我有下面的模型 我想为我的客户提供这些OData提要的统一战线 OData有什么好方法可以做到这一点吗?或者我应该从OData提要中获取IQueryables并在其上创建一个反射端点吗 如果我在OData上使用反射内容(通过实体框架)与数据库对话,我会遇到什么样的问题?我不会在客户端库上使用反射提供程序,主要是因为客户端库LINQ提供程序不支持服务器使用的所有构造。因此,一些查询根本不起作用(投影和扩展通常会中断)。 假设您不想在数据库之间创建任何关联,您应该能够简单地将用户指向正确的服务

假设我有下面的模型

我想为我的客户提供这些OData提要的统一战线

OData有什么好方法可以做到这一点吗?或者我应该从OData提要中获取IQueryables并在其上创建一个反射端点吗


如果我在OData上使用反射内容(通过实体框架)与数据库对话,我会遇到什么样的问题?

我不会在客户端库上使用反射提供程序,主要是因为客户端库LINQ提供程序不支持服务器使用的所有构造。因此,一些查询根本不起作用(投影和扩展通常会中断)。 假设您不想在数据库之间创建任何关联,您应该能够简单地将用户指向正确的服务。您仍然可以公开类似于统一端点的内容,而无需为所有端点提供相同的URL

其主要思想是统一$metadata(如果您的模型是静态的,您可以手动执行此操作,如果不是,您应该能够非常轻松地编写某种“合并”工具),然后提供一个指向每个实体集各自URL的服务文档。在WCF数据服务客户端中,现在通过实体集解析器支持此类服务:
有这种支持的最新CTP就在这里:

对这个问题目前被接受的答案不满意,对我来说,这更像是一个反答案,不应该做什么。我的解决方案在今天和11年一样适用

要支持租赁场景,其中每个用户/客户机数据将始终驻留在同一个数据库中,并且数据模式都匹配,那么您需要做的就是在实例化数据上下文时更改连接字符串

这个概念的另一个术语是切分,MS有一些工具和API可以提供帮助,这是一个足够简单的演练:但是您可以从第一个主体轻松地完成这项工作

如果换出连接字符串将适用于您的场景,我们需要确定用于确定连接字符串的机制,有两种常见的解决方案:

  • 简单的解决方法是在服务的每个请求中使用固定主机头、路由或令牌,然后您可以硬编码用于确定连接字符串的逻辑,而无需复杂的映射逻辑

  • 使用主/头/映射数据库存储配置

    这个数据库有一个单独的模式,它的主要用途是为每个请求检索正确的连接字符串。 在大多数情况下,我们将其与身份验证过程相结合,在这种情况下 您可以将身份验证保存在此中心数据库中,而不是单个数据库中

  • 就OData控制器而言,即使使用WCF数据服务,您也只需要实现检索连接字符串的逻辑,并在实例化数据上下文时使用该逻辑


    当然,如果客户的数据分布在多个数据库中,这对您没有帮助,但是,这是一种非常常见的模式,用于获取大型数据库,而不必为每个数据库部署新的服务场。

    是否希望用户能够通过使用类似
    的单一URL访问数据http://server/Entities.svc/User
    http://server/Entities.svc/Customer
    ,用户在DB1上,而客户来自DB2?实体是由DB隔离的,还是在DB之间分割?我想我想知道你想在这里完成什么。@David-你说得对。我想在一个OData端点中提供来自两个不同数据库的实体。这样做的目的是让我的客户不必知道他们必须访问的特定数据的端点列表。(实际上将有2个以上的数据库。)我需要与Vaccano相同的功能。如果OData公开的使用相同模式的数据库数量(=端点数量)是动态的,您会怎么做(意味着如果可以动态创建新数据库并使用新的OData端点公开此数据库。我需要客户端能够访问此新创建的数据库,而无需重新启动服务器。是否可能?我真的需要为每个新数据库创建一个OData端点吗?如果我有10个数据库,不是吗拥有10个OData端点的开销太大了?