0

我在我的 Asp.net / MVC 2 / 多租户应用程序中使用 Castle ActiveRecord,并将 SQL Server 作为我的后端。

对于每个登录的用户,应用程序会在运行时动态加载相应的数据库,如下所示:

IDictionary<string, string> properties = new Dictionary<string, string>();

    properties.Add("connection.driver_class", "NHibernate.Driver.SqlClientDriver");
    properties.Add("dialect", "NHibernate.Dialect.MsSql2005Dialect");
    properties.Add("connection.provider", "NHibernate.Connection.DriverConnectionProvider");
    properties.Add("proxyfactory.factory_class", "NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle");

    properties.Add("connection.connection_string", strDBConnection);

    InPlaceConfigurationSource source = new InPlaceConfigurationSource();
    source.Add(typeof(ActiveRecordBase), properties);

    ActiveRecordStarter.Initialize(new System.Reflection.Assembly[] { asm1 }, source);

strDBConnection字符串来自另一个包含用户信息、相应数据库等的小型数据库。

设想:

  1. 当用户登录时,他的数据库被加载,他可以做他的 CRUD 工作——没有问题!
  2. 另一个用户(从另一台远程机器)登录,他的数据库被加载——没有问题!
  3. 现在,当第一个用户从 DB 中读取数据时,他会从第二个用户的 DB 中看到新数据

我对这种行为的一点理解是:ActiveRecordStarter是一个静态对象。

有人可以帮我解决这种情况吗?

预期的行为:每个用户应该只访问他自己的数据库,安全地,并行/同时。

非常感谢 !

4

1 回答 1

0

ActiveRecordStarter.Initialize只应在您的应用程序中调用一次(在 Global.asax 中的 Application_Start 中)。

要实现您想要的,请创建一个继承自的类NHibernate.Connection.DriverConnectionProvider

public class MyCustomConnectionProvider : DriverConnectionProvider
{
    protected override string GetNamedConnectionString(IDictionary<string, string> settings)
    {
        return string.Empty;
    }

    public override IDbConnection GetConnection()
    {
        // Get your connection here, based on the request
        // You can use HttpContext.Current to get information about the current request
        var conn = Driver.CreateConnection();
        conn.ConnectionString = ... // Retrieve the connection string here;
        conn.Open();
        return conn;
    }
}

然后将 connection.provider 属性设置为您的类的名称:

 properties.Add("connection.provider", "MyCompany.Domain.MyCustomConnectionProvider, MyCompany.AssemblyName");
于 2013-05-01T07:01:28.387 回答