Я хотел, чтобы отладить `семян метод () в рамках класса сущностей конфигурации базы данных, когда я запускаю обновление-базы данных из консоли диспетчера пакетов, но это'т знаю, как это сделать. Я хотел бы поделиться решением с другими, если они имеют тот же вопрос.
Вот похожие Вопрос С решение, которое работает очень хорошо.<БР/>
Он не требует резьба.Сон
. <БР/>
Просто запускает отладчик, используя этот код.
Отсекается от ответа
if (!System.Diagnostics.Debugger.IsAttached)
System.Diagnostics.Debugger.Launch();
Я решил эту был открыть новый экземпляр Visual Studio, а затем откройте же решение в этом новом экземпляре Visual студии. Затем я прикрепил отладчик в этот новый экземпляр старого экземпляра (devenv.exe) при выполнении обновления базы данных. Это позволило мне отладить способ семян.
Просто чтобы убедиться, что я ничего'т пропустите останова, не прилагая в то время я добавила нитку.Спать до останова.
Я надеюсь, что это помогает кто-то.
Если вам нужно получить конкретную переменную's стоимостью, быстрый хак, чтобы бросить исключение:
throw new Exception(variable);
Чистое решение (я предполагаю, что это требует эф 6) будет имхо будет вызывать обновление базы данных из кода:
var configuration = new DbMigrationsConfiguration<TContext>();
var databaseMigrator = new DbMigrator(configuration);
databaseMigrator.Update();
Это позволяет отладить способ семян.
Вы можете принять это еще один шаг вперед и построить модульный тест (или, точнее, интеграционного тестирования), что создает пустую базу данных, тест, применяется всеми EF миграций, запускает метод семя, и снова падает на тестовой базе:
var configuration = new DbMigrationsConfiguration<TContext>();
Database.Delete("TestDatabaseNameOrConnectionString");
var databaseMigrator = new DbMigrator(configuration);
databaseMigrator.Update();
Database.Delete("TestDatabaseNameOrConnectionString");
Но будьте осторожны, чтобы не запустить это на вашей базе развития!
Я знаю, это старый вопрос, но если все вы хотите, сообщения, и вы не'т волнует, чтобы включать ссылки на приложения WinForms проекта, я сделал простое окно отладки, где я могу отправить трассировки событий.
Для более серьезных и пошаговую отладку, я'МР открыть другой визуальной студии экземпляра, но это's не необходимо для простой вещи.
Это весь код:
SeedApplicationContext.ЗС
в
using System;
using System.Data.Entity;
using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms;
namespace Data.Persistence.Migrations.SeedDebug
{
public class SeedApplicationContext<T> : ApplicationContext
where T : DbContext
{
private class SeedTraceListener : TraceListener
{
private readonly SeedApplicationContext<T> _appContext;
public SeedTraceListener(SeedApplicationContext<T> appContext)
{
_appContext = appContext;
}
public override void Write(string message)
{
_appContext.WriteDebugText(message);
}
public override void WriteLine(string message)
{
_appContext.WriteDebugLine(message);
}
}
private Form _debugForm;
private TextBox _debugTextBox;
private TraceListener _traceListener;
private readonly Action<T> _seedAction;
private readonly T _dbcontext;
public Exception Exception { get; private set; }
public bool WaitBeforeExit { get; private set; }
public SeedApplicationContext(Action<T> seedAction, T dbcontext, bool waitBeforeExit = false)
{
_dbcontext = dbcontext;
_seedAction = seedAction;
WaitBeforeExit = waitBeforeExit;
_traceListener = new SeedTraceListener(this);
CreateDebugForm();
MainForm = _debugForm;
Trace.Listeners.Add(_traceListener);
}
private void CreateDebugForm()
{
var textbox = new TextBox {Multiline = true, Dock = DockStyle.Fill, ScrollBars = ScrollBars.Both, WordWrap = false};
var form = new Form {Font = new Font(@"Lucida Console", 8), Text = "Seed Trace"};
form.Controls.Add(tb);
form.Shown += OnFormShown;
_debugForm = form;
_debugTextBox = textbox;
}
private void OnFormShown(object sender, EventArgs eventArgs)
{
WriteDebugLine("Initializing seed...");
try
{
_seedAction(_dbcontext);
if(!WaitBeforeExit)
_debugForm.Close();
else
WriteDebugLine("Finished seed. Close this window to continue");
}
catch (Exception e)
{
Exception = e;
var einner = e;
while (einner != null)
{
WriteDebugLine(string.Format("[Exception {0}] {1}", einner.GetType(), einner.Message));
WriteDebugLine(einner.StackTrace);
einner = einner.InnerException;
if (einner != null)
WriteDebugLine("------- Inner Exception -------");
}
}
}
protected override void Dispose(bool disposing)
{
if (disposing && _traceListener != null)
{
Trace.Listeners.Remove(_traceListener);
_traceListener.Dispose();
_traceListener = null;
}
base.Dispose(disposing);
}
private void WriteDebugText(string message)
{
_debugTextBox.Text += message;
Application.DoEvents();
}
private void WriteDebugLine(string message)
{
WriteDebugText(message + Environment.NewLine);
}
}
}
И на свой стандартный конфигурация.ЗС
в
// ...
using System.Windows.Forms;
using Data.Persistence.Migrations.SeedDebug;
// ...
namespace Data.Persistence.Migrations
{
internal sealed class Configuration : DbMigrationsConfiguration<MyContext>
{
public Configuration()
{
// Migrations configuration here
}
protected override void Seed(MyContext context)
{
// Create our application context which will host our debug window and message loop
var appContext = new SeedApplicationContext<MyContext>(SeedInternal, context, false);
Application.Run(appContext);
var e = appContext.Exception;
Application.Exit();
// Rethrow the exception to the package manager console
if (e != null)
throw e;
}
// Our original Seed method, now with Trace support!
private void SeedInternal(MyContext context)
{
// ...
Trace.WriteLine("I'm seeding!")
// ...
}
}
}
Отладка-это одно, но Дон'т забудьте позвонить: контексте.Обновление()
Также Дон'т забинтовать попробовать поймать без хорошей внутренней исключения разлива в консоли. https://coderwall.com/p/fbcyaw/debug-into-entity-framework-code-first с уловом (DbEntityValidationException экс)
У меня есть 2 решения (без отладчика.Запуск (), так как он не't работа для меня):
Сообщение для печати в пакет диспетчер исключений использовать консоль:
бросить новое исключение("и Ваше сообщение и");
Другой способ-напечатать сообщение в файл, создав команду " cmd " процесс: в в <предварительно><код> // Логов в файл {папке решения}\семян.данные журнала с семенной способ (только для отладки) частный недействительными журнал(строковое сообщение) { echoCmd строку = на"$;/с Эхо {Дата_время.Теперь} - {сообщение} >> семян.журнал" - а; Системы.Диагностика.Процесс.Начало("по УМК.ехе" и, echoCmd); } </код></пре>