使您的WCF服务会话基于,提供一个登录方法,并且在此方法中您必须决定使用哪个数据库,如果DataModel相同或者您拥有相同的数据模型,则可以更改edmx的ConnectionString 为每个客户端创建不同的DataModel,您必须为每个客户端创建一个edmx实例!
这里是一些简单的pseude码,ENTITYID标识Client
用于创建EntityConnectionString看看这个Link
要创建您需要定义服务接口一样,
一个基于会话的WCF服务
[ServiceContract(SessionMode = SessionMode.Required)]
public interface ISampleService
{
[OperationContract]
void Login(string user, string password, int entityID);
}
和ServiceImplementation应具有这些属性,根据您的需要更改这些值
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single, AutomaticSessionShutdown = true)]
public class SampleService : ISampleService
{
SampleEntities datacontext = null;
public void Login(string user, string password, int entityID)
{
if(CheckLoginData(user, password))
{
InitDataContext(entity_id);
}
}
private void InitDataContext(int entityID)
{
var connectionString = GetConnectionStringFromEntityID(entityID);
datacontext = new SampleEntities(connectionString);
}
private string GetConnectionStringFromEntityID(int entityID)
{
var providerName = "System.Data.SqlClient";
var serverName = "localhost";
var databaseName = GetDatabaseNameFromEntityID(entityID);
var sqlBuilder = new SqlConnectionStringBuilder();
sqlBuilder.DataSource = serverName;
sqlBuilder.InitialCatalog = databaseName;
sqlBuilder.IntegratedSecurity = true;
var providerString = sqlBuilder.ToString();
var entityBuilder = new EntityConnectionStringBuilder();
entityBuilder.Provider = providerName;
entityBuilder.ProviderConnectionString = providerString;
entityBuilder.Metadata = @"res://*/SampleDatabase.csdl|
res://*/SampleDatabase.ssdl|
res://*/SampleDatabase.msl";
return entityBuilder.ToString();
}
}
避免从客户端接收(甚至暴露)连接字符串的情况。 – Paparazzi