Ответ 1
Контекст EF не поддерживает запросы кросс-базы. Вам нужно разоблачить сообщения в базе данных1 через SQL View (или синоним) и использовать его как часть этой базы данных.
Есть ли способ реализовать кросс-запрос в базе данных Entity Framework? Представьте себе, что у меня есть два пользователя и почта Entities, пользовательский объект находится в базе данных1, а Post - в базе данных2, что означает, что эти объекты находятся в разных базах данных. Как получить сообщения пользователей в Entity Framework?
Контекст EF не поддерживает запросы кросс-базы. Вам нужно разоблачить сообщения в базе данных1 через SQL View (или синоним) и использовать его как часть этой базы данных.
Я знаю, что это старый вопрос, но на самом деле это возможно. Если базы данных находятся на одном сервере, то все, что вам нужно сделать, это использовать DbCommandInterceptor
.
Например, если я присоединяю DbCommandInterceptor
к MyContext
, я могу перехватить все выполнения команд и заменить указанные таблицы в запросе на мои пути full-db.
public override void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
{
// Here, I can just replace the CommandText on the DbCommand - but remember I
// want to only do it on MyContext
var context = contexts.FirstOrDefault() as MyContext;
if (context != null)
{
command.CommandText = command.CommandText
.Replace("[dbo].[ReplaceMe1]", "[Database1].[dbo].[Customers]")
.Replace("[dbo].[ReplaceMe2]", "[Database2].[dbo].[Addresses]")
.Replace("[dbo].[ReplaceMe3]", "[Database3].[dbo].[Sales]");
}
base.ReaderExecuting(command, interceptionContext);
}
Хорошая особенность этого подхода заключается в том, что EF Model Mapping по-прежнему работает должным образом и учитывает атрибуты столбцов, не требует представлений и не требует хранимых процедур.
Вы можете использовать ExecuteStoreQuery
, например:
var myOb = context.ExecuteStoreQuery<PlainOldClrObject>(
@"select *
from db1.dbo.table1 t1
join db2.dbo.table2 t2
on t2.t1_id = t1.id
where t1.id = {0}",
table1Id).FirstOrDefault();
Вам нужно определить класс PlainOldClrObject
со столбцами как свойствами с помощью getters/seters, например:
class PlainOldClrObject
{
public int Id ( get; set; }
public int Name ( get; set; }
...
}
Нет, вы не можете. Вам придется создавать контексты и присоединяться к себе. См. здесь.
Вы можете решить обмануть базу данных, создав представление в одной базе данных, отражая таблицу в другой.