Кросс-запросы к базе данных в EF
Есть ли способ реализовать кросс-запросы к базе данных в Entity Framework? Давайте представим, что у меня есть две сущности: пользователь и публикация, сущность пользователя в базе данных1 и публикация в базе данных2, что означает, что эти сущности находятся в отдельных базах данных. Как я должен получать сообщения пользователя в Entity Framework?
4 ответа
Контекст EF не поддерживает кросс-запросы к базе данных. Вам нужно выставить посты в database1 через 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 по-прежнему работает должным образом и учитывает атрибуты Column, не требует представлений и не требует хранимых процедур.
Ты можешь использовать 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
класс со столбцами как свойства с геттерами / сеттерами, например:
class PlainOldClrObject
{
public int Id ( get; set; }
public int Name ( get; set; }
...
}
Нет, ты не можешь. Вы должны будете создавать для контекстов и делать присоединение к себе. Смотрите здесь.
Вы можете разрешить хитрость базы данных, создав представление в одной базе данных, отражающее таблицу в другой.