ASP.NET MVC3 Механизм переключения базы данных для Entity Framework без использования сеанса? - PullRequest
2 голосов
/ 19 января 2012

Я создаю веб-сайт ASP.NET MVC3 с подходом EF и DB. Мне нужно придумать надежный механизм переключения контекста базы данных во время выполнения для пользователей. У меня есть несколько баз данных (одна и та же схема), которые используются в удаленных «мастерских», и пользователи приложений в штаб-квартире компании должны иметь возможность переключаться между базами данных в любое время.

Сначала я реализовал базовый контроллер, у которого был ChangeDbContext (строка dbname). Он сохранял выбранный dbName в Session, а затем я извлекал данные из Session в методе OnActionExecuting. Однако он оказался ненадежным, потому что сеанс вел себя непредсказуемо (случайное истечение срока действия и т. Д.), Поэтому я ищу разумный способ заменить Session чем-то другим.

Я мог бы использовать советы по: - куда поместить инициализацию объекта EntityFramework (конструктор BaseController?) - есть ли какие-либо дополнительные изменения, которые я должен сделать, чтобы использовать олицетворение с WindowsAuth для подключения к БД?

Ответы [ 3 ]

2 голосов
/ 25 января 2012

Во-первых, вам нужно убедиться, что ваш сеанс приложений может пережить перезапуски и повторные пулы приложений. См. Это

Во-вторых, вам нужно ввести строку подключения для вашего DBContext на основе запроса аутентифицированного пользователя.

Я предполагаю, что у вас есть база данных, полная пользователейпоэтому вам нужно сохранить список возможных строк подключения в таблице SQL и связать их с соответствующими учетными записями пользователей.После аутентификации пользователя вам нужно получить строку подключения, связанную с учетной записью пользователя. Вы не хотите хранить строку подключения в сеансе или любом другом механизме, который потенциально может предоставить конфиденциальные данные веб-клиенту. Итак, вкратце, это то, что вам нужно сделать.

  1. Вы захотите получить строку подключения для каждого запроса на основе аутентифицированного пользователя.
  2. Вставьте строку подключения в ваш DBContext.
  3. Делайте вызовы из базы данных по мере необходимости.
  4. Деньги!

Вводить строки в сущность легко.

Если вы сначала используете код EF 4.1, ваш DBContext будет выглядеть примерно так.EF 4.1 принимает обычные строки подключения ADO.NET.

public class ExampleProvider : DbContext, IExampleProvider
{
    private readonly string _nameOrStringConnection;

    public ExampleProvider()
    {

    }

    public ExampleProvider(string nameOrStringConnection)
        : base(nameOrStringConnection)
    {
        _nameOrStringConnection = nameOrStringConnection;
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<Example>().ToTable("example");
        modelBuilder.Entity<Example>().HasKey(x => x.ExampleId);
    }

    public DbSet<Example> Examples { get; set; }

}

Если вы используете EF.edmx, вам нужно будет убедиться, что ваша строка введенного подключения содержит информацию о файлах метаданных edmx, как это ...

... "metadata = res: ///ExampleModel.csdl | res: ///ExampleModel.ssdl | res: //*/ExampleModel.msl; ...

Если вы загляните в файл конструктора edmx, вы увидите, что ваш DBContext имеет несколько перегрузок конструктора. Используйте вторую или третью перегрузку в соответствии с вашими потребностями.

# Контексты региона

/// <summary>
/// No Metadata Documentation available.
/// </summary>
public partial class Entities : ObjectContext
{
    #region Constructors

    /// <summary>
    /// Initializes a new Entities object using the connection string found in the 'Entities' section of the application configuration file.
    /// </summary>
    public Entities() : base("name=Entities", "Entities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

    /// <summary>
    /// Initialize a new Entities object.
    /// </summary>
    public Entities(string connectionString) : base(connectionString, "Entities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

    /// <summary>
    /// Initialize a new Entities object.
    /// </summary>
    public Entities(EntityConnection connection) : base(connection, "Entities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

    #endregion
    /// incomplete file

Удачи!

1 голос
/ 19 января 2012

Файлы cookie могут сохраняться в течение длительного срока, намного дольше, чем сеанс в любом случае. Вы также можете посмотреть скрытую переменную страницы или искаженный URL.

0 голосов
/ 26 января 2012

1) Сессии не истекают случайно ... но по истечении времени, установленного в we.config ... по умолчанию 10 минут.Срок действия лицензии ДОЛЖЕН истечь, поскольку невозможно узнать, что пользователь покинул наш веб-сайт ... поэтому, если он прекратит доступ к страницам, скажем, на 10 минут, мы предполагаем, что они ушли ... Вы можете увеличить это время, но проблема остается,2) Вы можете хранить информацию непосредственно в куки.Теперь, поскольку cookie-файлы расходуют только ресурсы в браузере (очень мало места), вы можете сделать cookie-файл постоянным ... таким образом, чтобы он никогда не истекал. 3) В качестве альтернативы cookie-файлам вы можете хранить эту информацию вместе с учетными данными пользователей (имя пользователя и т. д.) Для определения свойства DBChosen можно использовать поставщик профиля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...