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

时间:2011-04-26 12:37:56

标签: sql-server web-services entity-framework-4

我想设计一个服务于许多客户的应用程序 我希望在同一个数据库中为不同客户提供数据,但每个客户的数据都在他/她自己的架构中
所以:

  • 1个包含多个模式的DB
  • 每个架构代表1个客户
  • 为每个客户运行相同的程序,以便每个客户具有在他/她的架构下分组的相同表格

问题:

  1. 这种情况适用于EF4吗?
  2. 有1个为所有客户提供服务的网络服务?
  3. 将每个客户信息的EF4指向正确的架构?
  4. 在Web服务请求期间如何在模式之间切换?

3 个答案:

答案 0 :(得分:1)

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

以下是单个实体的SSDL声明示例(您可以看到edmx:model/Schema/EntityContainer/EntitySet/@Schema定义的架构):

<!-- 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>
  1. 是的,它会起作用,但正如我所描述的那样,这不是一个好的解决方案。
  2. 是的,您可以拥有一项服务所有客户的服务,但您必须设计正确的身份验证才能连接到正确的表集。如果您处理敏感数据,您的公司可能会遇到非常严重的法律问题,而您的客户会因意外(因为错误)而访问其他客户的数据。
  3. 验证问题并将经过身份验证的用户映射到正确的表集 - 这完全在EF之外。
  4. 您将使用多个连接字符串(每个客户一个),或者您将动态构建实体连接。
  5. 这里的正确方法是为每个客户创建新数据库。它更易于维护,并且为这种情况设置安全性要容易得多。

答案 1 :(得分:0)

我无法理解你的问题。我不明白为什么你需要多个模式...

我觉得你只需要在顶级表中添加一个CustId外键字段,这样你就可以使用连接来按客户使用相同的模式过滤数据......

也许你的问题需要更多细节......

答案 2 :(得分:0)

没有尝试过这样的事情,但是使用FluentNHibernate可能会更容易 - 您可以在那里的代码中指定架构关联。肯定。

还可以从配置方向解决这个问题 - SQL用户可以设置默认架构,这样您就可以引用无模式的所有内容,然后在假设配置正确的情况下它将在生产中排队。