Linq to Entities управляет разрешением имен таблиц во время выполнения - PullRequest
1 голос
/ 13 февраля 2011

Я внедрил систему управления контентом, которая имеет дело с определенным видом объекта, и теперь клиент представил другой тип объекта, структура и поведение которого точно такие же, но отдельные.Они хотят иметь возможность переключать режимы, где каждый режим ведет себя одинаково, за исключением того, что один имеет дело с одним типом объекта, а другой - с другим.

Предположим, что первый тип объекта хранится в таблице с именем TBL_OBJECT, а второй - в таблице с именем TBL_OBJECT_NEW.Я ищу способ использовать свой существующий код, но чтобы иметь возможность переключаться на лету и заставить его переключиться на другую таблицу.Поскольку структура идентична, это концептуально возможно.Единственная проблема заключается в том, что в L2E имя таблицы сохраняется как атрибут и компилируется, поэтому я ищу способ подключить процесс создания оператора SQL, чтобы мои существующие операторы выглядели так:

Dim db as New DataContext
Dim query = From obj in db.Objects

преобразуется в таблицу TBL_OBJECT_NEW вместо таблицы TBL_OBJECT.Если я могу сделать это, я могу повторно использовать огромное количество кода.Я знаю, что это несколько необычный сценарий, но я действительно надеюсь, что это возможно.Любая помощь высоко ценится!Спасибо.

Кстати, я для этого использую LinqConnect от DevArt;Я не знаю, насколько простой L2E-подход будет применяться к этому.С другой стороны, если вы знаете, как сделать это с DevArt, но НЕ L2E, это все равно будет очень полезно.

1 Ответ

1 голос
/ 14 февраля 2011

Нам неизвестно о возможности сопоставления двух идентичных таблиц с одной концептуальной сущностью.

Как в LinqConnect , так и в Entity Framework есть решение. Например, вы можете попробовать переключиться между двумя моделями, имеющими только одно различие (первая модель будет отображать TBL_OBJECT, вторая - TBK_OBJECT_NEW).

Решение LinqConnect :

Чтобы переключаться между разными таблицами с одинаковой структурой в LinqConnect, вы можете создать два файла .lqml и загрузить отображение из одного из них для текущего экземпляра DataContext:

string mappingFileName;
if (...) // Check whether TBL_OBJECT_A should be used
  mappingFileName = "MyDataContext_A.lqml";
else 
  mappingFileName = "MyDataContext_B.lqml";
Stream contextStream = System.IO.File.OpenRead(mappingFileName);
System.Data.Linq.Mapping.MappingSource mappingSource =
Devart.Data.Linq.Mapping.XmlMappingSource.FromStream(contextStream);
MyDataContext context = new MyDataContext(connectionString, mappingSource);

Кроме того, мы планируем поддерживать плавное отображение (подход, когда отображение устанавливается в вашем коде без использования атрибутов или файлов отображения), хотя в настоящее время не можем предоставить никаких временных рамок для этого. Вы можете проголосовать за эту функцию на нашем UserVoice .

Решение Entity Framework :

Установите для свойства обработки артефактов метаданных значение CopyToOutputDirectory. После этого перейдите к сгенерированным файлам SSDL и измените имя таблицы с «TBL_OBJECT» на «TBL_OBJECT_NEW». Теперь остается только создать контекст с правильной строкой подключения (вы можете добавить новую строку подключения в файл конфигурации приложения или передать всю строку подключения в конструктор ObjectContext ).

...