2010-06-29 2 views
2

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

Например, возьмите колонку FolderName. Мы могли бы иметь:

Dev: u34_FolderName 
QA: u74_FolderName 
PROD: u56_FolderName 

Я хочу сделать запросы как это:

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

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

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

+6

ИМО вы должны найти человека, который решил настроить БД таким образом и избить его полностью. – juharr

+0

juharr, это имеет смысл. Очень возможно построить 234 в производстве, 250 все еще в qa и 300 в dev. Имена столбцов просто гарантируют, что вы связываетесь с правой таблицей, которая, если вы думаете об этом, пытается -prevent- то, что пытается сделать @Owen (запрос одного размера для всех). Конечно, его читают только, но философия, применимая к правам, также должна применяться к чтению в этом случае. – corsiKa

+0

Схемы управляются третьей стороной значительной сложности. Я бы попытался победить это в подчинении, но он не чувствует боли. Вся причина этого упражнения заключается в том, чтобы обойти некоторые ограничения API, которые он предоставляет. –

ответ

0

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

1

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

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

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

Таким образом, ваш запрос будет как

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

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

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

0

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

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

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

0

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

Смежные вопросы