Таблицы отображения DbContext динамически - PullRequest
2 голосов
/ 30 сентября 2011

Если у меня есть dbContext, строка подключения которого создается во время создания контекста, а затем я хочу отобразить имена таблиц на основе некоторой этой информации .... как бы я передал эти данные в сопоставления таблиц? Например:

private object createContext(string name, string country)
{
    DbConnectionstringbuilder conn = new DbConnectionstringbuilder();
    conn.Add("Provider", "System.Data.SqlClient");
    conn.ConnectionString = string.Format(name, "dbName_" + country + "_moreName");   
    //maybe an if/else since we will say there are more names and countries
    return new object(conn.ToString());
}

Теперь, когда вы инициализируете dbcontext, это что-то вроде:

public class object : DbContext
{
    public object(string conn):base(conn)
    {
        DbDatabase.SetInitializer<object>(null);
    }
//insert dbset and mapping config calls here
}

Теперь я хочу, чтобы мои таблицы отображались как "table_" + country + "_endtablename"; Я думаю, как мне получить эти данные, передаваемые в вызов сопоставления?

Эти таблицы сопоставлены с существующей базой данных, которая использовала этот формат. Страна на самом деле исходит из учетных данных вошедшего в систему пользователя и, таким образом, основана на местоположении и т. Д. Мне просто нужно найти способ доступа к тому коду страны, который является внутренним конструктором, к базовому классу в последнем созданном dbcontext.

1 Ответ

0 голосов
/ 30 сентября 2011

Хорошо ... Я бы сделал метод фабрики для вашего класса DbContext, а затем реализовал производные классы DbContext для каждой страны, которую вы хотите поддерживать.Это даст вам возможность настроить инициализатор базы данных для каждой страны.Поскольку все производные конкретные DbContexts используют одного и того же абстрактного родителя, вы можете просто привести их в качестве родителя и использовать их.В инициализаторе вы можете использовать плавные отображения, чтобы установить имя базы данных и сопоставить имена таблиц, которые вам нужны.Прелесть EF Code First в том, что он позволяет вам использовать стандартные OO-шаблоны (например, Factory Method) для решения проблем, подобных той, которую вы описываете.

Однако я должен сказать, что вы можете переосмыслитьсхема именования вашей таблицы.Причина, по которой вы находите это сложным, заключается в том, что это несколько необычная установка.Конечные пользователи обычно не занимаются созданием запросов непосредственно к таблицам в вашей базе данных, потому что слишком сложно применять бизнес-правила.Если нет технологической причины, по которой вам требуется, чтобы таблицы в каждой базе данных имели имена, закодированные по странам, я бы позволил этой технологии управлять вашими схемами именования таблиц и позволить вашему клиенту стимулировать взаимодействие с конечным пользователем.Я думаю, что названия страновых кодированных баз данных являются адекватными.Это обеспечивает разделение данных, но значительно упрощает кодирование и заставляет запросы, написанные для одной базы данных, работать с другими.

...