Ответ 1
Вы можете сделать это, даже на серверах, до тех пор, пока вы можете получить доступ к одной базе данных из другой. То есть, если можно написать инструкцию SQL ServerA.DatabaseA, которая обращается к ServerB.DatabaseB.schema.TableWhatever, то вы можете сделать то же самое в LINQ.
Чтобы сделать это, вам нужно вручную отредактировать файл .dbml. Вы можете сделать это в VS 2008 легко следующим образом: щелкните правой кнопкой мыши, выберите Открыть с... и выберите XML-редактор.
Посмотрите на элемент Связь, который должен находиться в верхней части файла. Что вам нужно сделать, это предоставить явное имя базы данных (и имя сервера, если оно отличается) для таблиц, не указанных в базе данных, на которые указывает эта строка соединения.
Исходный тег для элемента Таблица в вашем .dbml выглядит следующим образом:
<Table Name="dbo.Customers" Member="Customers">
Что вам нужно сделать, для любой таблицы, не содержащей в базе данных строки подключения, изменить атрибут Имя на что-то вроде этого:
<Table Name="SomeOtherDatabase.dbo.Customers" Member="Customers">
<Table Name="SomeOtherServer.SomeOtherDatabase.dbo.Customers" Member="Customers">
Если у вас возникли проблемы, убедитесь, что другая база данных (или сервер) действительно доступна из исходной базы данных (или сервера). В SQL Server Management Studio попробуйте написать небольшой оператор SQL, работающий с вашей исходной базой данных, который делает что-то вроде этого:
SELECT SomeColumn
FROM OtherServer.OtherDatabase.dbo.SomeTable
Если это не работает, убедитесь, что у вас есть пользователь или логин с доступом к обоим базам данных с тем же паролем. Разумеется, он должен быть таким же, как тот, который используется в вашей строке подключения .dbml.