Как изменить имя / источник таблицы LINQ O / RM во время выполнения?

У меня есть база данных и набор сущностей, созданный O / R-Mapper, использующий все это с LINQ.

В O / R-Mapper мне нужно ввести имя таблицы (источник) для каждой таблицы, которая используется для SQL, сгенерированного LINQ. В файле .dbml это выглядит так:

<Table Name="dbo.Customers" Member="Customers">

Теперь я хотел бы изменить это имя таблицы во время выполнения, чтобы SQL запускался для какой-то другой таблицы (например, customers2008 вместо customer).

Есть ли способ изменить имя таблицы (имя источника) во время выполнения?

[Обновление] После некоторого тестирования, к моему ужасу, я обнаружил, что XmlMappingSource действительно отображает вычисленные свойства, которые не сохраняются в базе данных, недоступными (да, даже сопоставление, созданное SqlMetal, игнорирует все, что не сохраняется).

Ответов (2)

Решение

Типа ... Вам нужно будет сделать что-то вроде этого:

  1. Создайте сущности в дизайнере.
  2. Используйте SqlMetal для создания файла сопоставления xml из файла .dbml, созданного дизайнером.
  3. Обновите имена таблиц в XML-файле.
  4. Затем в коде используйте перегрузку конструктора DataContext, которая принимает XmlMappingSource, созданный с помощью файла сопоставления xml.

Вот сообщение в блоге, в котором шаг за шагом объясняется этот процесс: http://weblogs.asp.net/guybarrette/archive/2008/07/23/linq-to-sql-dynamic-mapping.aspx

Я использую аналогичный процесс с базой данных ERP, в которой есть имена таблиц, например ttccom001xxx, где xxx - идентификатор установки (я знаю, что это ужасная схема, но я ничего не могу с этим поделать). У нас несколько установок, поэтому я копирую исходное сопоставление xml один раз для каждой установки, а затем заменяю xxx на идентификатор установки. Я написал небольшое консольное приложение, которое использует Regex, чтобы позаботиться о заменах, и добавил его как часть процесса сборки.

Вот ссылка на Microsoft External Mapping Reference .

Внешнее сопоставление переопределяет сопоставление на основе атрибутов.

Вот самое главное.

  1. Создайте некоторый xml, представляющий ваши сопоставления.
  2. Новый вверх с XmlMappingSource и дать ему ваш XML.
  3. Когда вы создаете свой DataContext, используйте конструктор, который принимает XmlMappingSource, например этот .