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
- 每个模式代表一个客户
- 为每个客户运行相同的程序,因此每个客户在其架构下都有相同的表
这是可能的,但比看起来要困难得多。EDMX文件由定义映射元数据的三部分组成:SSDL(数据库描述)、CSDL(实体描述)、MSL(SSDL和CSDL之间的映射)。模式信息是SSDL的一部分。如果要访问不同的模式,必须切换整个SSDL文档=需要新的实体连接或连接字符串。您还必须为每个客户创建SSDL 下面是单个实体的SSDL声明示例(您可以在
edmx:model/schema/EntityContainer/EntitySet/@schema
)中看到定义的模式:
这里正确的方法是为每个客户创建新的数据库。它具有更好的可维护性,而且为这种情况设置安全性要容易得多。我无法集中精力解决您的问题。我不明白为什么您需要多个模式 在我看来,您只需要在顶级表中添加一个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>