The database setup we are using currently is 3 "standard" databases where 
their mapping schema is mapped to "database.schema", however we also have a 
set of mapped items where the mapping of the schema is to .schema. This 
database schema/architecture design may sound unorthodox but it something I 
can't change, so please don't suggest that. 

The current use for this DAL is in a MVC web application, we are using 
Autofac MVC dependency resolver to scope a session the full lifetime of a 
web request. We then use Castle Proxies to intercept requests to our 
Services that are marked with a transaction attribute or requests to 
Repositories, and sniff the httpcontext information to determine which 
database to point to. We create a unit of work with the interceptor, which 
based on the sniffed database value calls 
Session.Connection.ChangeDatabase(database);  This solution works great 
with lazy loading turned off.

We had a different setup before that was not very flexible and have moved 
to this setup. Previously we had lazy loading turned off and we are trying 
to, with our new solution, turn it back on. In our integration tests we are 
able to lazy load successfully with the static schema objects, however the 
"dynamic schema" database lazy loading is problematic, because when it goes 
to lazy load it will encounter an ADOException "Invalid object name 
'.schema.table'", which makes sense.

We also need to be able to switch databases during a transaction, so we 
can't tie the session directly to the database we want to connect to.

I am curious if there is anyway to intercept the lazy loading requests and 
execute a Session.Connection.ChangeDatabase command.  This of course also 
has the requirement that I can somehow store which database a particular 
entity came from so that I can reapply when I intercept the request which 
database to target. My guess is I may need to implement an interceptor and 
wire it in differently IE config.SetInterceptor (in the code below) and 
perhaps during Instantiate I could set some property that is available to 
all "Dynamic Database" models IE Database, and then during lazy load 
intercept and issue the ChangeDatabase on the session.  

Here is what the Autofac registeration looks like that we use now:


            builder.Register(c => {
                string connectionString = 
String.Format(Configuration.Settings.Infrastructure.ConnectionString, 
DEFAULT_DATABASE);
                var config = new Configuration();
                config.DataBaseIntegration(db => {
                    db.Driver<SqlClientDriver>();
                    db.Dialect<MsSql2008Dialect>();
                    db.ConnectionString = connectionString;
                });
                config.AddAssembly(typeof(UnitOfWork).Assembly);
                // maybe config.SetInterceptor(new SomeCustomInterceptor())
                ISessionFactory factory = config.BuildSessionFactory();
                return new RedactedSessionFactory(DEFAULT_DATABASE, factory);
            }).As<IRedactedSessionFactory>()
              .SingleInstance();
 
 
            // Repository Interceptor.
            builder.Register((c, p) => {
                IRedactedSessionFactory factory = 
c.Resolve<IRedactedSessionFactory>();
                string name = GetDatabaseNameFromEnvironment(c, p);
                name = name ?? DEFAULT_DATABASE;
                factory.Database = name;
                return new UnitOfWorkInterceptor(factory, name);
            }).InstancePerLifetimeScope();

-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/nhusers.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to