Подтвердить что ты не робот

Кросс-запрос в базе данных EF

Есть ли способ реализовать кросс-запрос в базе данных Entity Framework? Представьте себе, что у меня есть два пользователя и почта Entities, пользовательский объект находится в базе данных1, а Post - в базе данных2, что означает, что эти объекты находятся в разных базах данных. Как получить сообщения пользователей в Entity Framework?

4b9b3361

Ответ 1

Контекст EF не поддерживает запросы кросс-базы. Вам нужно разоблачить сообщения в базе данных1 через SQL View (или синоним) и использовать его как часть этой базы данных.

Ответ 2

Я знаю, что это старый вопрос, но на самом деле это возможно. Если базы данных находятся на одном сервере, то все, что вам нужно сделать, это использовать 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 по-прежнему работает должным образом и учитывает атрибуты столбцов, не требует представлений и не требует хранимых процедур.

Ответ 3

Вы можете использовать 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; }
    ...
}

Ответ 4

Нет, вы не можете. Вам придется создавать контексты и присоединяться к себе. См. здесь.

Вы можете решить обмануть базу данных, создав представление в одной базе данных, отражая таблицу в другой.