Кросс-запросы к базе данных в 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; }
    ...
}

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

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

Другие вопросы по тегам