Использование Hangfire, строка подключения, указанная в Startup.cs throws Не удается привязать файл к ошибке базы данных

Я использую Hangfire в своем ASP.Net MVC Web App, он был успешно установлен. Я хотел бы использовать тот же LocalDb для хранения заданий в очереди для Hangfire, чтобы удалить и обработать, как я использовал для хранения данных. Однако я столкнулся с приведенной ниже ошибкой, когда я представил свой connectionString или имя, определенное в Web.config в Startp.cs. У меня не возникло проблем с добавлением, удалением обновлений данных в том же localDb перед тем, как надеть флеш.

Cannot attach the file 'c:\users\jerry_dev\documents\visual studio 2013\Projects\Hangfire.Highlighter\Hangfire.Highlighter\App_Data\aspnet-Hangfire.Highlighter-20150113085546.mdf' as database 'aspnet-Hangfire.Highlighter-20150113085546'.

Startup.cs:

public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);
            app.UseHangfire(config =>
            {
                string hangfireConnectionString = @"Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-Hangfire.Highlighter-20150113085546.mdf;Initial Catalog=aspnet-Hangfire.Highlighter-20150113085546;Integrated Security=True";
                config.UseSqlServerStorage(hangfireConnectionString);
                config.UseServer();
            });
        }

Мой проект Решение называется "Hangfire.Highlighter"

Web.config:

<connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-Hangfire.Highlighter-20150113085546.mdf;Initial Catalog=aspnet-Hangfire.Highlighter-20150113085546;Integrated Security=True" providerName="System.Data.SqlClient" />
</connectionStrings>

Ответ 1

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

Мое решение состояло в том, чтобы просто создать быстрый и грязный DbContext, указать ему правильную строку подключения и вызвать Database.CreateIfNotExists в конструкторе:

public class HangfireContext : DbContext
{
    public HangfireContext() : base("name=HangfireContext")
    {
        Database.SetInitializer<HangfireContext>(null);
        Database.CreateIfNotExists();
    }
}

В методе HangfireBootstrapper.Start() я делаю что-то вроде этого:

public void Start()
{
    lock (_lockObject)
    {
        if (_started) return;
        _started = true;

        HostingEnvironment.RegisterObject(this);

        //This will create the DB if it doesn't exist
        var db = new HangfireContext();

        GlobalConfiguration.Configuration.UseSqlServerStorage("HangfireContext");

       // See the next section on why we set the ServerName
        var options = new BackgroundJobServerOptions()
        {
            ServerName = ConfigurationManager.AppSettings["HangfireServerName"]
        };

        _backgroundJobServer = new BackgroundJobServer(options);

        var jobStarter = DependencyResolver.Current.GetService<JobBootstrapper>();

        //See the Recurring Jobs + SimpleInjector section
        jobStarter.Bootstrap();

    }
}

Не знаете, почему Hangfire испытывает такие трудности с LocalDb - может быть, он может обрабатывать только полноценные экземпляры SQL? В любом случае это работает для меня, новых членов команды и новых экземпляров dev/staging/prod, которые встали.

Ответ 2

Я тоже знаю, что это старо, но натолкнулся на это в последнее время. Вот мое исправление:

  • В Visual Studio перейдите в "Просмотр → Проводник SQL Server"
  • Подключитесь к источнику данных, если он еще не подключен. В приведенном выше примере это было (LocalDb)\v11.0 '
  • Щелкните правой кнопкой мыши "Базы данных" → "Добавить новую базу данных"
  • Заполните имя базы данных = Ex: 'aspnet-Hangfire.Highlighter-20150113085546' или как вы назвали базу данных в строке соединения.
  • Заполните расположение базы данных = Это должен быть каталог данных в вашем приложении, "App_Data" для проекта MVC.

Это устранило проблему в моем случае.

Ответ 3

Разве база данных уже создана? Можете ли вы попробовать использовать другой формат строки conneciton? Что-то вроде этого, "Server =.; Database = HangFire.Highlighter; Trusted_Connection = True;"

Ответ 4

Ответ Jack не работал у меня, потому что я столкнулся с этой проблемой: В файле конфигурации приложения не найдено ни одной строки строки связи

Я получил его для работы со следующими изменениями:

  • Удалите "name=" из строки в базовом инициализаторе. Благодаря: fooobar.com/info/498378/...
  • Это приведет к ошибке при вызове UseSqlServerStorage. Поэтому вместо передачи "HangfireContext" к нему я просто копирую строку подключения из контекста базы данных.

Полный установочный код:

public class HangfireContext : DbContext
{
    public HangfireContext() : base("HangfireContext")  // Remove "name="
    {
        Database.SetInitializer<HangfireContext>(null);
        Database.CreateIfNotExists();
    }
}

public partial class Startup
{
    public static void ConfigureHangfire(IAppBuilder app)
    {
        var db = new HangfireContext();

        GlobalConfiguration.Configuration.UseSqlServerStorage(db.Database.Connection.ConnectionString);  // Copy connection string

        app.UseHangfireDashboard();
        app.UseHangfireServer();
    }
}