Sql server EF4如何切换模式(例如dbo->;custId),以便在多个模式下存储相同的表

Sql server EF4如何切换模式(例如dbo->;custId),以便在多个模式下存储相同的表,sql-server,web-services,entity-framework-4,Sql Server,Web Services,Entity Framework 4,我想设计一个为许多客户服务的应用程序 我希望在同一数据库中有不同客户的数据,但每个客户的数据在其自己的模式中 所以: 具有多个模式的1db 每个模式代表一个客户 为每个客户运行相同的程序,因此每个客户在其架构下都有相同的表 问题: 这个场景是否适用于EF4 是否有一个为所有客户提供服务的Web服务 是否将每个客户信息的EF4点指向正确的模式 在web服务请求期间如何在模式之间切换 这是可能的,但比看起来要困难得多。EDMX文件由定义映射元数据的三部分组成:SSDL(数据库描述)、CSDL(

我想设计一个为许多客户服务的应用程序
我希望在同一数据库中有不同客户的数据,但每个客户的数据在其自己的模式中
所以:

  • 具有多个模式的1db
  • 每个模式代表一个客户
  • 为每个客户运行相同的程序,因此每个客户在其架构下都有相同的表
问题:

  • 这个场景是否适用于EF4
  • 是否有一个为所有客户提供服务的Web服务
  • 是否将每个客户信息的EF4点指向正确的模式
  • 在web服务请求期间如何在模式之间切换

  • 这是可能的,但比看起来要困难得多。EDMX文件由定义映射元数据的三部分组成:SSDL(数据库描述)、CSDL(实体描述)、MSL(SSDL和CSDL之间的映射)。模式信息是SSDL的一部分。如果要访问不同的模式,必须切换整个SSDL文档=需要新的实体连接或连接字符串。您还必须为每个客户创建SSDL

    下面是单个实体的SSDL声明示例(您可以在
    edmx:model/schema/EntityContainer/EntitySet/@schema
    )中看到定义的模式:

    
    
  • 是的,它会工作,但正如我所描述的,它不是一个好的解决方案
  • 是的,您可以有一个服务为所有客户服务,但您必须设计正确的身份验证以连接到正确的表集。如果您处理敏感数据,并且您的客户会意外(因为bug)访问另一个客户的数据,那么您的公司可能会有很大的法律问题
  • 身份验证和将经过身份验证的用户映射到正确的表集的问题-这完全超出了EF
  • 您将使用多个连接字符串(每个客户一个)或动态构建实体连接

  • 这里正确的方法是为每个客户创建新的数据库。它具有更好的可维护性,而且为这种情况设置安全性要容易得多。

    我无法集中精力解决您的问题。我不明白为什么您需要多个模式

    在我看来,您只需要在顶级表中添加一个CustId外键字段,这样您就可以使用连接按客户使用相同的模式筛选数据


    也许您的问题需要更详细的信息…

    还没有尝试过类似的方法,但是使用FluentNHibernate可能会更容易——您可以在代码中明确指定模式关联


    还可以从配置方向解决这个问题--SQL用户可以设置一个默认模式,这样您就可以少引用任何模式,然后在假定配置正确的情况下,它将在生产中排队。

    -如果您只需要1 db,因为这样可以省钱。-对于n dbs,您仍然存在类似的连接字符串问题。-将字段添加到n个表中以分离客户比分离连接字符串危险得多,因此如果新客户注册,我必须使用所有表创建新模式,将ssdl复制到“newSchema”,然后将所有模式引用更改为“newSchema”,然后针对每次访问(在我的示例中,web服务调用n-tier)构建连接字符串,程序的其余部分不受影响。听起来它可以正常工作?是的,它可以,但这不是一个好的解决方案。
    <!-- SSDL content -->
    <edmx:StorageModels>
      <Schema Namespace="Model.Store" Alias="Self" Provider="System.Data.SqlClient"
              ProviderManifestToken="2008" 
              xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" 
              xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">
        <EntityContainer Name="ModelStoreContainer">
          <EntitySet Name="TestEntitySet" EntityType="Model.Store.TestEntitySet" 
                     store:Type="Tables" Schema="dbo" />
        </EntityContainer>
        <EntityType Name="TestEntitySet">
          <Key>
            <PropertyRef Name="Id" />
          </Key>
          <Property Name="Id" Type="int" StoreGeneratedPattern="Identity" 
                    Nullable="false" />
        </EntityType>
      </Schema>
    </edmx:StorageModels>