У меня есть многозадачное приложение, которое использует одно и то же веб-приложение с несколькими базами данных клиентов и имеющее общий DbContext. Когда пользователь регистрируется на основе своих учетных данных, я предоставляю строку подключения к DbContext и загружаю данные. Проблема возникает, когда одновременно регистрируется несколько пользовательских журналов, и они могут видеть данные друг друга, поскольку DbContext продолжает переключение между разными пользователями.Как использовать совместное использование EF одного DbContext для нескольких баз данных
Я использую EF 5.0 и Autofac IOC в основном. Каков наилучший способ справиться с этим?
Как я могу сохранить свой DbContext свои данные для этого конкретного пользователя и не изменится, даже если другие пользователи вошли в систему и будут иметь разные контексты баз данных для них?
Вот код в моей странице входа
protected void LoginBtn_Click(object sender, EventArgs e)
{
int i = Convert.ToInt32(CustomerId.Text);
var builder = new ContainerBuilder();
var profile = _profileProvider.GetCustomerProfile(i);
ConnectionStringManager.ConnectionString = profile.connString;
builder.RegisterModule<CustomerDataModule>();
builder.Update(_container);
Response.Redirect("Home.aspx");
}
Это моя статическая переменная, которая дает строку соединения
public static class ConnectionStringManager
{
public static string ConnectionString { get; set; }
}
Вот мой модуль, который имеет все объекты и контекстные классы,
public class CustomerDataModule : Autofac.Module
{
protected override void Load(ContainerBuilder builder)
{
builder.Register(c =>
{
ConnectionString = ConnectionStringManager.ConnectionString;
return new CustomerDataContext(ConnectionString);
})
.As<ICustomerDataContext>()
.As<IDbContext>()
.InstancePerDependency();
builder.RegisterType<CustomerDataContextFactory>().As<ICustomerDataContextFactory>();
var assembly = Assembly.GetExecutingAssembly();
builder.RegisterAssemblyTypes(assembly)
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces()
.InstancePerDependency();
}
}
Вот мой DbContext,
public partial class CustomerDataContext: DbContext, ICustomerDataContext
{
public CustomerDataContext(string connectionString)
: base(connectionString)
{ }
.......
Вот мой один из репозитория,
public class CustomerRepository : GenericRepository<Customer, int>, ICustomerRepository
{
public CustomerRepository(ICustomerDataContext context)
: base(context, customer => customer.Id)
{
}
}
Вы изучили многоэтажные расширения Autofac, Autofac.Extras.Multitenant.dll? См. Http://code.google.com/p/autofac/wiki/MultitenantIntegration. По крайней мере, вы не можете установить строку подключения в статической переменной, ее нужно вывести из самого контейнера на основе пользовательского контекста запроса. –
Я немного новичок в autofac, я обязательно пойду и изучу расширения с несколькими арендаторами. Можете ли вы показать мне небольшой фрагмент кода, чтобы получить его из контейнера на основе пользовательского контекста, чтобы избежать статической переменной? – rajcool111