Как выполнить запросы LINQ к базе данных с изменяющейся схемой? - PullRequest
2 голосов
/ 30 июня 2010

Мне нужно выполнять запросы только для чтения к базе данных, которую я не контролирую.Мой лучший выбор - Linq to SQL, однако имена столбцов в наших средах Dev, QA и Production немного различаются.

Например, возьмем столбец FolderName.У нас может быть:

Dev:  u34_FolderName
QA:   u74_FolderName
PROD: u56_FolderName

Я хочу выполнить такие запросы:

 var query = from c in DepartmentReviews
             where c.FolderName == "Test"

Могу ли я использовать Entity Framework для решения этой проблемы?

Как выглядит потенциальное решение?3 сборки, по 1 для каждой из моих сред?Могу ли я создать общие интерфейсы или базовые классы для каждого из них и код для них?

Ответы [ 5 ]

1 голос
/ 30 июня 2010

Изменение схемы всегда является проблемой. Хотя я не являюсь большим сторонником хранения XML в базе данных, похоже, ваша проблема может использовать этот подход.

Это решение требует, чтобы вы сделали одно (и только одно изменение схемы). Это может / не может быть осуществимо в вашем приложении.

В вашей таблице у вас, вероятно, будет столбец для уникального идентификатора и столбец для xml (SQL Server 2005/2008, естественно, поддерживает его). Вы можете сериализовать его как XML (вы, вероятно, в конечном итоге будете использовать универсальный XML Serializer- Serializer<T>, тип которого вы бы вывели во время выполнения, используя отражение). Десериализовать его, и вы можете получить свой объект. Вы можете прочитать больше об этом здесь .

Таким образом, ваш запрос будет выглядеть как

var myXML = from c in ObjectContext.Table
             where c.FolderName == "Test" select MyXmlColumn;

var myType = InferTypeFromConfig();
var serializer = new XmlSerializer<myType>();
var object = (myType )serializer.Deserialize(TheXMLStreamCreatedFrom(myXml));

мои $ 0,02

0 голосов
/ 30 июня 2010

В EF 4 вы можете сделать это довольно легко с помощью Code First , который в настоящее время находится в CTP.

0 голосов
/ 30 июня 2010

Используя Entity Framework, вы можете манипулировать файлом EDMX во время сборки, чтобы достичь желаемого результата для каждой среды, см. http://msdn.microsoft.com/en-us/library/cc982042.aspx

Например, вы можете создать проект, который выполняет предварительную обработку для соответствующей среды во время сборки, и включить этот файл проекта в MSBUILD в качестве первого создаваемого проекта.

Или вы можете сгенерировать несколько файлов CSDL, MSL, SSDL и переключаться между ними во время выполнения вместо использования поведения по умолчанию, которое заключается в загрузке их из ресурсов, встроенных в процессе сборки.

0 голосов
/ 30 июня 2010

Рассматривали ли вы создание собственного слоя доступа к данным?Если ваши запросы ограничены конкретным набором случаев, это не будет полноценной структурой.У вас будет общий словарь, расположенный над тремя схемами базы данных, и вы выберете правильное необработанное имя столбца во время выполнения.Вы просто скомпонуете свои запросы по старинке.

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

0 голосов
/ 30 июня 2010

Возможно, вам придется использовать XmlMappingSource вместо AttributeMappingSource по умолчанию. С XmlMappingSource вы можете настроить сопоставление столбцов в xml-файле независимо от основного приложения. Это должно позволить вам иметь различные отображения от dev, qa и production.

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