Как зарегистрировать SQL с использованием структуры сущностей 4.3 (сначала код) и базы данных SQL Azure - PullRequest
4 голосов
/ 15 февраля 2012

Я понимаю, что подобный вопрос задавался несколько раз, и я попробовал рекомендации по этим вопросам безуспешно.

Я использую платформу сущностей (4.3) и использую SQL Azure (в базе данных объединения). Я хотел бы иметь возможность регистрировать SQL, который генерируется структурой сущностей.

Я использовал Entity Profiler Framework , и хотя это полезно во время разработки, я не уверен, что это будет полезно во время производства.

Я не могу использовать SQL Profiler, поскольку это база данных SQL Azure.

Я попытался использовать EFTracingProvider и выполнить шаги в здесь . К сожалению, когда я пытаюсь выполнить свою первую команду (которая использует соответствующую федерацию), я получаю исключение, указывающее, что «указанный метод не поддерживается».

Код, который генерирует ошибку, следующий:

public MyContext(int tenantId) 
    : base(CreateTracingConnection("TheDb"), true)
{
    const string FederationCmdText =
        "USE FEDERATION TenantFederation(CustomerId = {0}) WITH RESET, FILTERING=ON";

    ((IObjectContextAdapter)this).ObjectContext.EnableTracing();

    ((IObjectContextAdapter)this).ObjectContext.Connection.Open();

    // This is the line which throws the exception
    this.Database.ExecuteSqlCommand(string.Format(FederationCmdText, tenantId));        
}

Вот исключение:

Specified method is not supported.
at EFProviderWrapperToolkit.DbConnectionWrapper.CreateDbCommand()
at System.Data.Common.DbConnection.CreateCommand()
...

Итак, вот мои вопросы:

  • Является ли EFTracingProvider предпочтительным подходом для регистрации SQL-запросов (глобально)?
  • Если так, есть идеи, почему я получаю вышеуказанное исключение?
  • Если нет, есть ли другой механизм, который позволит мне регистрировать весь SQL, сгенерированный Entity Framework?

Спасибо за вашу помощь, Eric

1 Ответ

5 голосов
/ 15 февраля 2012

Проблема, с которой я столкнулся, заключалась в том, что, как мне кажется, EFTracingProvider не поддерживает прямое выполнение SQL. Чтобы обойти эту проблему, одно решение является следующим (который я нашел в Q & A от здесь )

Создайте следующий класс:

public class DbTracingConnection : EFTracingConnection
{
    protected override DbCommand CreateDbCommand()
    {
        return this.WrappedConnection.CreateCommand();
    }
}

При создании соединения используйте вышеуказанный класс вместо EFTracingConnection.

...