我想设计一个服务于许多客户的应用程序
我希望在同一个数据库中为不同客户提供数据,但每个客户的数据都在他/她自己的架构中
所以:
问题:
答案 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 :(得分:0)
我无法理解你的问题。我不明白为什么你需要多个模式...
我觉得你只需要在顶级表中添加一个CustId外键字段,这样你就可以使用连接来按客户使用相同的模式过滤数据......
也许你的问题需要更多细节......
答案 2 :(得分:0)
没有尝试过这样的事情,但是使用FluentNHibernate可能会更容易 - 您可以在那里的代码中指定架构关联。肯定。
还可以从配置方向解决这个问题 - SQL用户可以设置默认架构,这样您就可以引用无模式的所有内容,然后在假设配置正确的情况下它将在生产中排队。